Domanda

Voglio generare alcuni XML in una procedura memorizzata basata sui dati in una tabella.

Il seguente inserto mi permette di aggiungere molti nodi ma devono essere hardcoded o usare variabili (sql: variabile):

SET @MyXml.modify('
      insert
         <myNode>
            {sql:variable("@MyVariable")}
         </myNode>
      into (/root[1]) ') 

Quindi potrei scorrere ogni record nella mia tabella, mettere i valori di cui ho bisogno in variabili ed eseguire l'istruzione sopra.

Ma c'è un modo in cui posso farlo combinandomi con un'istruzione select ed evitando il ciclo?

Modifica Ho usato SELEZIONA PER XML per fare cose simili prima, ma trovo sempre difficile leggere quando lavoro con una gerarchia di dati da più tabelle. Speravo che ci fosse qualcosa usando modifica dove l'XML generato è più esplicito e più controllabile.

È stato utile?

Soluzione

Hai provato annidamento FOR XML PATH funzioni a valori scalari? Con la tecnica di annidamento, puoi frenare il tuo SQL in pezzi elementali molto gestibili / leggibili

Dichiarazione di non responsabilità: quanto segue, sebbene adattato da un esempio funzionante, non è stato letteralmente testato

Alcuni link di riferimento per il pubblico generale

L'esempio di nodo nidificato più semplice al livello più basso

Considera la seguente invocazione

DECLARE  @NestedInput_SpecificDogNameId int
SET @NestedInput_SpecificDogNameId = 99
SELECT [dbo].[udfGetLowestLevelNestedNode_SpecificDogName] 
(@NestedInput_SpecificDogNameId)

Supponiamo che udfGetLowestLevelNestedNode_SpecificDogName sia stato scritto senza la clausola FOR XML PATH e per @NestedInput_SpecificDogName = 99 restituisca il record del singolo set di righe:

@SpecificDogNameId  DogName
99                  Astro

Ma con la clausola FOR XML PATH,

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

la funzione definita dall'utente produce il seguente XML (i segni @ fanno sì che il campo SpecificDogNameId venga restituito come attributo)

<Dog SpecificDogNameId=99>Astro</Dog>

Annidamento di funzioni definite dall'utente di tipo XML

Le funzioni definite dall'utente come sopra udfGetLowestLevelNestedNode_SpecificDogName possono essere nidificate per fornire un metodo potente per produrre XML complessi.

Ad esempio, la funzione

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 invocato come

SELECT [dbo].[udfGetDogCollectionNode]()

potrebbe produrre il nodo XML complesso (dati appropriati dati sottostanti)

<DogCollection>
    <Dog SpecificDogNameId="88">Dino</Dog>
    <Dog SpecificDogNameId="99">Astro</Dog>
</DogCollection>

Da qui, puoi continuare a lavorare verso l'alto nell'albero nidificato per costruire una struttura XML complessa come desideri

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 invocato come

SELECT [dbo].[udfGetAnimalCollectionNode]()

udf potrebbe produrre il nodo XML più complesso (dati appropriati sottostanti)

<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>

Altri suggerimenti

Puoi dirci qualcosa in più su cosa stai pianificando di fare esattamente. Sta semplicemente generando dati XML basati su un contenuto della tabella o aggiungendo alcuni dati dalla tabella a una struttura xml esistente?

Ci sono grandi serie di articoli sull'argomento su XML in SQLServer scritto da Jacob Sebastian, inizia con le nozioni di base sulla generazione di XML dai dati in la tabella

Usa sql: column invece di sql: variabile. Puoi trovare informazioni dettagliate qui: http://msdn.microsoft.com/en -us / library / ms191214.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top