2017-08-31 79 views
0

我正在嘗試使用Sql Server從XML檢索數據。使用Sql服務器從xml中檢索浮點值

獲取數據從SQL Server

DECLARE @salary float=null 
     DECLARE @xml xml 

     SET @xml = '<root><Salary>0.0</Salary></root>' 

     select 
     @salary = case when ISNULL(x.v.value('Salary[1]','nvarchar(100)'),'0') != '0' then x.v.value('Salary[1]','float') else 10000 end 
     from @xml.nodes('/root') x(v);   

     print @salary 

當工資爲0.0的情況下狀態是否正常工作,因爲它是顯示輸出爲0

但是,當我們使用薪金爲0(不含小數),case語句正確工作並顯示99作爲輸出。

獲取數據從SQL Server

DECLARE @salary float=null 
    DECLARE @xml xml 

    SET @xml = '<root><Salary>0</Salary></root>' 

    select 
    @salary = case when ISNULL(x.v.value('Salary[1]','nvarchar(100)'),'0') != '0' then x.v.value('Salary[1]','float') else 10000 end 
    from @xml.nodes('/root') x(v); 

    print @salary 
+0

因爲它是一個 「近似」 數你永遠不應該使用貨幣FLOAT數據類型。更好地使用MONEY,SMALLMONEY,DECIMAL或NUMERIC ......也就是說,您的值基於FLOAT數據類型正確顯示。如果它後面沒有任何東西,Float將不顯示小數點。檢查這個結果... SELECT CAST(0 AS FLOAT),CAST(0.0 AS FLOAT),CAST(1.1 AS FLOAT); –

+0

感謝您的信息。它只是一個演示來說明問題。 – Pearl

+0

你的代碼似乎工作正常。你所描述的是FLOAT和REAL數據類型的標準行爲。更改數據類型,你會問題消失。 :) –

回答

0

下面的查詢會有所幫助。

DECLARE @DocHandle INT, 
     @Xml NVARCHAR(MAX) 
SET @XMl = N'<root><Salary>0.00</Salary></root>' 
EXEC sp_xml_preparedocument @DocHandle OUTPUT, @Xml 

SELECT CASE WHEN Salary <> 0 THEN Salary ELSE 10000 END AS Salary 
FROM OPENXML (@DocHandle , '/root') 
WITH (Salary DECIMAL(18,3), 'Salary') 

OUTPUT:

Salary 
-------- 
10000