A seguir function
, escrevi que aceita xml
e retorna table
como resultado.
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
E a seguir está o código que estou usando para executar acima function
, mas sempre retornando o Empty
resultado.
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
XQuery diferencia maiúsculas de minúsculas, assim como as coisas geralmente ao lidar com XML. Corrija sua função para ter um elemento maiúsculo
Listing
e funcionará. Percebi que você também passou,@ID
mas não o usou e acidentalmente trocou suas colunasValue1
e .Value2
Você também deve sempre usar otext()
acessador ao ler XML não digitado para aumentar o desempenho, como no meu exemplo abaixo.Isso funcionou para mim:
Meus resultados:
Apenas como um aparte, sua função é simples o suficiente para ser uma função com valor de tabela em linha, em vez de uma de várias linhas. Os TVFs embutidos geralmente têm melhor desempenho. Poste de volta se você quiser saber mais sobre isso.
HTH