2016-03-02 148 views
2

正在關注function我寫了接受xml並返回table作爲結果。爲什麼SQL函數總是返回空結果集?

CREATE FUNCTION FunctionTest(@ID INT,@XML_Details xml) 
RETURNS @RESULT TABLE 
(
    Value1 INT, 
    Value2 INT 
) 
AS 
BEGIN 
    DECLARE @tbl_Xml_Result Table 
    (
     Value1 INT, 
     Value2 INT 
    ) 

    INSERT INTO @RESULT(Value1,Value2) 
    SELECT 
     l.v.value('Value2[1]','INT'), 
     l.v.value('Value1[1]','INT') 
    FROM @XML_Details.nodes('/Listings/listing')l(v) 
    RETURN 
END 

而下面是我的代碼使用反對上述function運行,但它總是返回Empty結果。

DECLARE @tbl_Xml_Result Table 
(
     Value1 INT, 
     Value2 INT 
) 
INSERT INTO @tbl_xml_Result 
values(1,2),(2,3),(3,4),(4,5),(5,6) 


DECLARE @xml_Temp xml 

SET @xml_Temp = ( SELECT * 
        FROM @tbl_xml_Result 
        FOR XML PATH('Listing'),ROOT('Listings') 
       ) 

DELETE FROM @tbl_xml_Result 
INSERT INTO @tbl_xml_Result(Value1,Value2) 
Select 
    T.Value1, 
    T.Value2 
FROM FunctionTest(1,@xml_Temp) T 

select * from @tbl_Xml_Result 
+0

請不要按照這種方式進行編輯(實際上是提出全新的問題)。你的信號問題已經解決了。如果您需要進一步的幫助,請考慮向http://sqlfiddle.com演示提出新的問題,其中包括您的真實架構**和數據。 [有關變色龍問題的更多信息](http://meta.stackexchange.com/questions/43478/exit-strategies-for-chameleon-questions) – lad2025

回答

3

首先在可能的情況下避免多行功能。 Inline UDFs have better pefromance

XQuery區分大小寫,並且您沒有'/Listings/listing'路徑。

第三種:您可能想要使用@ID進行過濾。

CREATE FUNCTION FunctionTest(@ID INT,@XML_Details xml) 
RETURNS TABLE 
AS 
RETURN(
    SELECT Value1, Value2 
    FROM (SELECT 
      l.v.value('(Value2)[1]','INT') AS Value2, 
      l.v.value('(Value1)[1]','INT') AS Value1 
      FROM @XML_Details.nodes('/Listings/Listing')l(v)) AS sub 
    WHERE Value1 = @ID 
    ) 
GO 

DECLARE @tbl_Xml_Result Table(Value1 INT,Value2 INT); 
INSERT INTO @tbl_xml_Result(Value1, Value2) 
values(1,2),(2,3),(3,4),(4,5),(5,6); 

DECLARE @xml_Temp xml = (SELECT * 
          FROM @tbl_xml_Result 
          FOR XML PATH('Listing'),ROOT('Listings')); 

SELECT T.Value1, 
     T.Value2 
FROM FunctionTest(1,@xml_Temp) T; 

LiveDemo

2

在函數的第19行的問題:

FROM @XML_Details.nodes('/Listings/listing')l(v) 

* L isting - 你需要大號 isting