2017-01-03 7 views
0

У меня есть список десятичных значений в формате XML, отформатированный с помощью итальянской локализации (то есть запятой как разделитель десятичной дроби и точкой в ​​виде разделителя тысяч), и мне нужно преобразовать в десятичные значения.SQL Server Xquery, отбрасываемый до десятичного с локализацией it-IT

XML-как это:

<ROW> 
    <COSTO>2</COSTO> 
    <COSTO>3,6</COSTO> 
    <COSTO>1.005,10</COSTO> 
</ROW> 

Когда извлекаются, десятичные числа будет:

2 
3.6 
1005.10 

Я использую REPLACE функцию для удаления точек и преобразовать запятые точки, перед тем использование CONVERT функция:

CONVERT(decimal(10,2), REPLACE(REPLACE(
    XMLDATA.value('(//COSTO)[1]','nvarchar(20)') 
    , '.',''), ',','.')) 

Есть ли какой-либо syn налог, чтобы заставить Xquery читать значение с помощью локализации, чтобы получить значение как десятичное?

Нечто подобное (это не работает):

XMLDATA.value('(//COSTO)[1] with local it-IT','decimal(10,2)') 

Благодаря

+0

Какая у вас версия SQL Server? – har07

+0

SQL Server 2008R2 – Radioleao

ответ

0

Если есть запятые в значении, вы можете конвертировать в ДЕНЬГИ первым, например:

DECLARE @xml XML 
SET @xml='<ROW> 
      <COSTO>2</COSTO> 
      <COSTO>3,6</COSTO> 
      <COSTO>1.005,10</COSTO> 
</ROW>' 
SELECT CASE WHEN ISNUMERIC(t.v)=1 THEN CONVERT(decimal(10,2),REPLACE(REPLACE(t.v,'.',''),',','.')) ELSE 0 END  
FROM @xml.nodes('ROW/COSTO') s(b) 
CROSS APPLY(VALUES(s.b.value('.','varchar(100)'))) t(v) 
 
--------------------------------------- 
2.00 
3.60 
1005.10 

Если ваша версия сервера установлена ​​на 2012 год, вы можете использовать функцию PASE

SELECT PARSE(t.v AS MONEY USING 'it-IT') 
FROM @xml.nodes('ROW/COSTO') s(b) 
CROSS APPLY(VALUES(s.b.value('.','varchar(100)'))) t(v) 
+0

Это не работает. Конечные значения должны быть: 2, 3.5 и 1005.1. – Radioleao

+0

вы можете использовать CASE КОГДА ISNUMERIC (tv) = 1 THEN CONVERT (десятичный (10,2), REPLACE (REPLACE (tv, '.', ''), ',', '.')) ELSE 0 END –

+0

I 'm уже используют два 'REPLACE', я хочу извлечь значение с помощью локализации, чтобы избежать использования этих двух' REPLACE'. – Radioleao