Попробуйте это: org.apache.commons.math3.util.Precision.round (double x, int scale)
Домашняя страница библиотеки математики 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;
}
}
}
Попробуйте использовать функцию .value
вместо .query
:
SELECT
xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)')
FROM
LogTable
Выражение XPath потенциально может вернуть список узлов, поэтому вам нужно добавить [1]
в этот потенциальный список чтобы SQL Server использовал первую из этих записей (и да - этот список основан на 1, а не на основе 0). В качестве второго параметра вам нужно указать, к какому типу нужно преобразовать значение - просто гадать здесь.
Marc
$doc/param[@value = "valueB"]/fn:data(@value)
Предполагая, что $ doc имеет Xml.
В зависимости от фактической структуры вашего 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'
boolean
- он имеетBIT
- или вам просто нужно прочитать его какINT
, а затем обработать его дальше – marc_s 6 January 2015 в 17:45