2017-01-03 1 views
0

XML 형식의 소수점 값 목록 (소수점 구분 기호로 쉼표로 사용되며 천 단위 구분 기호로 점)이 10 진수 값으로 변환되어야합니다. 추출 할 때현지화로 소수점 이하로 캐스팅 된 SQL Server Xquery

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

의 진수가 될 것입니다 :

2 
3.6 
1005.10 

내가 전에 점을 제거하고 점에 쉼표를 변환 REPLACE 기능을 사용하고

XML은 다음과 같이이다 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)') 

감사 값에 쉼표가있는 경우, 당신은 예를 들어, 첫 번째 MONEY로 변환 할 수 있습니다

+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

ELSE 0 END –

+0

I (변환) (십진수 (10,2), REPLACE (REPLACE (tv, '.', '')))를 사용할 수 있습니다. 이미 두 개의 REPLACE를 사용하고 있습니다.이 두 REPLACE의 사용을 피하기 위해 지역화 된 값을 추출하고 싶습니다. – Radioleao

관련 문제