Экспорт XML-поля XML в сетку [дубликат]

Попробуйте это: org.apache.commons.math3.util.Precision.round (double x, int scale)

См.: http://commons.apache.org/proper/ commons-math / apidocs / org / apache / commons / math3 / util / Precision.html

Домашняя страница библиотеки математики Apache Commons: http://commons.apache.org/ proper / commons-math / index.html

Внутренняя реализация этого метода:

public static double round(double x, int scale) {
    return round(x, scale, BigDecimal.ROUND_HALF_UP);
}

public static double round(double x, int scale, int roundingMethod) {
    try {
        return (new BigDecimal
               (Double.toString(x))
               .setScale(scale, roundingMethod))
               .doubleValue();
    } catch (NumberFormatException ex) {
        if (Double.isInfinite(x)) {
            return x;
        } else {
            return Double.NaN;
        }
    }
}

31
задан marc_s 13 October 2009 в 17:04
поделиться

3 ответа

Попробуйте использовать функцию .value вместо .query:

SELECT 
  xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)') 
FROM  
  LogTable

Выражение XPath потенциально может вернуть список узлов, поэтому вам нужно добавить [1] в этот потенциальный список чтобы SQL Server использовал первую из этих записей (и да - этот список основан на 1, а не на основе 0). В качестве второго параметра вам нужно указать, к какому типу нужно преобразовать значение - просто гадать здесь.

Marc

52
ответ дан marc_s 22 August 2018 в 10:59
поделиться
  • 1
    Благодарю. Именно то, что мне нужно. – My Other Me 13 October 2009 в 17:12
  • 2
    У меня есть динамические узлы в поле типа & lt; l & gt; & lt; r id = "2" / & GT; & lt; r id = "5" / & GT; & Л; / л & GT; Используя ваш запрос, я могу читать по индексу. Значения Когда я укажу индекс как 1, он отобразит 2, и когда я укажу индекс 2, он отобразит 5, но мне нужны оба узла. так что, пожалуйста, предложите мне, как это сделать! – pixelbyaj 13 September 2013 в 08:34
  • 3
    У меня возникли проблемы с использованием этого для логического. Я попытался использовать «boolean» и «System.Boolean» в качестве вторых параметров и получил ошибку. Если я делаю varchar, он возвращает все значения null. Моя строка xml выглядит так: & lt; Property Name = & quot; param & quot; Значение = & Quot; Правда & Quot; Тип = & Quot; System.Boolean & Quot; / & GT; – Zac 6 January 2015 в 17:32
  • 4
    @Zeb: SQL Server не имеет типа boolean - он имеет BIT - или вам просто нужно прочитать его как INT, а затем обработать его дальше – marc_s 6 January 2015 в 17:45
  • 5
    Да спасибо. Бит отлично работает! – Zac 6 January 2015 в 17:59

$doc/param[@value = "valueB"]/fn:data(@value) Предполагая, что $ doc имеет Xml.

0
ответ дан bosari 22 August 2018 в 10:59
поделиться

В зависимости от фактической структуры вашего xml, может быть полезно поместить ее в нее, чтобы было проще использовать «регулярный» sql, например

CREATE VIEW vwLogTable
AS
SELECT
    c.p.value('@name', 'varchar(10)') name,
    c.p.value('@value', 'varchar(10)') value
FROM
    LogTable
    CROSS APPLY x.nodes('/container/param') c(p)
GO


-- now you can get all values for paramB as...
SELECT value FROM vwLogTable WHERE name = 'paramB'
6
ответ дан user 22 August 2018 в 10:59
поделиться
  • 1
    Почему xmlCol.value ('(/ container / param [@ name = & quot; paramB & quot;] / @ value) [1]', 'varchar (50)') не работает для меня, а просто .value ('@ value' , 'vharchar (50)') работает? Hmmmmm. – AndyClaw 28 August 2013 в 19:58
Другие вопросы по тегам:

Похожие вопросы: