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.

Foi útil?

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

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?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top