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)
XQuery 区分大小写,处理 XML 时通常也是如此。更正您的函数以具有大写Listing
元素,它将起作用。我注意到你也传入了@ID
但不使用它并且不小心交换了你的Value1
和Value2
列。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
归档时间: |
|
查看次数: |
1369 次 |
最近记录: |