No SQL Server eu posso inserir vários nós em XML de uma tabela?
-
02-07-2019 - |
Pergunta
Eu quero gerar alguns XML em um procedimento armazenado com base em dados em uma tabela.
A seguir inserção me permite adicionar vários nós, mas eles têm que ser codificados ou usar variáveis ??(sql: variable):
SET @MyXml.modify('
insert
<myNode>
{sql:variable("@MyVariable")}
</myNode>
into (/root[1]) ')
Assim eu poderia percorrer cada registro na minha mesa, colocar os valores que eu preciso em variáveis ??e executar a instrução acima.
Mas há uma maneira eu posso fazer isso por apenas combinando com uma instrução SELECT e evitando o loop?
Editar eu tenho SELECT FOR XML
costumava fazer coisas semelhantes antes, mas eu sempre achei difícil de ler quando se trabalha com uma hierarquia de dados de várias tabelas. Eu estava esperando que seria algo usando o modify
onde o XML gerado é mais explícito e mais controlável.
Solução
Você já tentou nidificação para funções valorizadas XML PATH escalares? Com a técnica de aninhamento, você pode frear seu SQL em partes elementares muito gerenciável / legíveis
Disclaimer: o seguinte, enquanto adaptado de um exemplo de trabalho, não tem em si foi literalmente testada
Alguns links de referência para o público em geral
- http://msdn2.microsoft.com/en -us / library / ms178107 (SQL.90) .aspx
- http://msdn2.microsoft.com/en -us / library / ms189885 (SQL.90) .aspx
O, menor nível aninhado exemplo mais simples nó
Considere o seguinte invocação
DECLARE @NestedInput_SpecificDogNameId int
SET @NestedInput_SpecificDogNameId = 99
SELECT [dbo].[udfGetLowestLevelNestedNode_SpecificDogName]
(@NestedInput_SpecificDogNameId)
Vamos digamos teve udfGetLowestLevelNestedNode_SpecificDogName tinha sido escrito sem a cláusula FOR XML PATH, e para @NestedInput_SpecificDogName = 99 ele retorna o único registro do conjunto de linhas:
@SpecificDogNameId DogName 99 Astro
Mas com a cláusula PATH XML FOR,
CREATE FUNCTION dbo.udfGetLowestLevelNestedNode_SpecificDogName
(
@NestedInput_SpecificDogNameId
)
RETURNS XML
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultVar XML
-- Add the T-SQL statements to compute the return value here
SET @ResultVar =
(
SELECT
@SpecificDogNameId as "@SpecificDogNameId",
t.DogName
FROM tblDogs t
FOR XML PATH('Dog')
)
-- Return the result of the function
RETURN @ResultVar
END
A função definida pelo usuário produz o seguinte XML (os sinais @ faz com que o campo SpecificDogNameId a ser retornado como um atributo)
<Dog SpecificDogNameId=99>Astro</Dog>
funções definidas pelo usuário do assentamento do tipo XML
funções definidas pelo usuário, como a acima udfGetLowestLevelNestedNode_SpecificDogName podem ser aninhados para fornecer um método poderoso para produzir XML complexo.
Por exemplo, a função
CREATE FUNCTION [dbo].[udfGetDogCollectionNode]()
RETURNS XML
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultVar XML
-- Add the T-SQL statements to compute the return value here
SET @ResultVar =
(
SELECT
[dbo].[udfGetLowestLevelNestedNode_SpecificDogName]
(t.SpecificDogNameId)
FROM tblDogs t
FOR XML PATH('DogCollection') ELEMENTS
)
-- Return the result of the function
RETURN @ResultVar
END
Quando invocado como
SELECT [dbo].[udfGetDogCollectionNode]()
pode produzir o nó XML complexo (dado os dados subjacentes apropriado)
<DogCollection>
<Dog SpecificDogNameId="88">Dino</Dog>
<Dog SpecificDogNameId="99">Astro</Dog>
</DogCollection>
A partir daqui, você pode continuar trabalhando para cima na árvore aninhada para construção tão complexa uma estrutura XML como quiser
CREATE FUNCTION [dbo].[udfGetAnimalCollectionNode]()
RETURNS XML
AS
BEGIN
DECLARE @ResultVar XML
SET @ResultVar =
(
SELECT
dbo.udfGetDogCollectionNode(),
dbo.udfGetCatCollectionNode()
FOR XML PATH('AnimalCollection'), ELEMENTS XSINIL
)
RETURN @ResultVar
END
Quando invocado como
SELECT [dbo].[udfGetAnimalCollectionNode]()
a UDF pode produzir o nó XML mais complexo (dado os dados subjacentes apropriado)
<AnimalCollection>
<DogCollection>
<Dog SpecificDogNameId="88">Dino</Dog>
<Dog SpecificDogNameId="99">Astro</Dog>
</DogCollection>
<CatCollection>
<Cat SpecificCatNameId="11">Sylvester</Cat>
<Cat SpecificCatNameId="22">Tom</Cat>
<Cat SpecificCatNameId="33">Felix</Cat>
</CatCollection>
</AnimalCollection>
Outras dicas
Você pode contar um pouco mais sobre o que exatamente você está planejando fazer. É simplesmente a geração de dados XML com base em um conteúdo da tabela ou a adição de alguns dados da tabela para uma estrutura xml existente?
Há grande série de artigos sobre o assunto em XML em SQLServer escrito por Jacob Sebastian, ele começa com os noções básicas de geração de XML a partir dos dados a mesa
Use sql: coluna em vez de sql: variable. Você pode encontrar todos os detalhes aqui: http://msdn.microsoft.com/en -us / library / ms191214.aspx