In SQL Server posso inserire più nodi in XML da una tabella?
-
02-07-2019 - |
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.
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
- http://msdn2.microsoft.com/en -us / library / ms178107 (SQL.90) .aspx
- http://msdn2.microsoft.com/en -us / library / ms189885 (SQL.90) .aspx
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