为什么SQL函数总是返回空结果集?

Kai*_*shu 1 xml sql-server sql-server-2012

下面function我写了接受xml并返回table结果。

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
Run Code Online (Sandbox Code Playgroud)

以下是我用来运行上面的代码,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
Run Code Online (Sandbox Code Playgroud)

wBo*_*Bob 5

XQuery 区分大小写,处理 XML 时通常也是如此。更正您的函数以具有大写Listing元素,它将起作用。我注意到你也传入了@ID但不使用它并且不小心交换了你的Value1Value2列。text()在读取非类型化 XML 以提高性能时,您还应该始终使用访问器,如下面的示例所示。

这对我有用:

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('(Value1/text())[1]','INT'),
        l.v.value('(Value2/text())[1]','INT')
    FROM @XML_Details.nodes('/Listings/Listing')l(v)

    RETURN
END
GO


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
Run Code Online (Sandbox Code Playgroud)

我的结果:

我的结果

顺便说一句,您的函数足够简单,可以成为内联表值函数而不是多行函数。内联 TVF 通常表现更好。如果您想了解更多信息,请回帖。

HTH