In SQL Server kann füge ich mehrere Knoten in XML-Daten aus einer Tabelle?
-
02-07-2019 - |
Frage
Ich mag einige XML in einer gespeicherten Prozedur erzeugen, basierend auf Daten in einer Tabelle.
Der folgende Einsatz ermöglicht es mir, viele Knoten hinzuzufügen, aber sie haben hart codiert oder verwenden Sie Variablen (sql: variable): to be
SET @MyXml.modify('
insert
<myNode>
{sql:variable("@MyVariable")}
</myNode>
into (/root[1]) ')
So durch jeden Datensatz Schleife in meinem Tisch, ich könnte, setzen die Werte, die ich in Variablen benötigen und die obige Anweisung ausführen.
Aber ist es eine Möglichkeit, dies nur mit einer select-Anweisung kombiniert und die Vermeidung der Schleife tun?
Bearbeiten Ich habe verwendet SELECT FOR XML
vor ähnliche Dinge zu tun, aber ich es immer schwer zu lesen, wenn sie mit einer Hierarchie von Daten aus mehreren Tabellen zu arbeiten. Ich war es etwas mit dem modify
wäre die Hoffnung, wo die XML erzeugte deutlicher und besser kontrollierbar ist.
Lösung
Haben Sie versucht, Verschachtelung FOR XML PATH Skalar Wertfunktionen? Mit der Verschachtelung Technik können Sie Ihre Bremse SQL in sehr überschaubares / lesbar elementares Stück
Disclaimer: die folgenden, während sie von einem Arbeitsbeispiel angepasst, hat sich nicht wörtlich getestet
Einige Referenzlinks für das allgemeine Publikum
- http://msdn2.microsoft.com/en -US / library / ms178107 (SQL.90) aspx
- http://msdn2.microsoft.com/en -US / library / ms189885 (SQL.90) aspx
Die einfachste, unterste Ebene verschachtelter Knoten Beispiel
Betrachten Sie den folgenden Aufruf
DECLARE @NestedInput_SpecificDogNameId int
SET @NestedInput_SpecificDogNameId = 99
SELECT [dbo].[udfGetLowestLevelNestedNode_SpecificDogName]
(@NestedInput_SpecificDogNameId)
Lassen Sie uns sagen hatte udfGetLowestLevelNestedNode_SpecificDogName hatte, ohne die FOR XML PATH-Klausel geschrieben worden ist, und für @NestedInput_SpecificDogName = 99 gibt sie den einzelnen rowset Datensatz:
@SpecificDogNameId DogName 99 Astro
Aber mit dem FOR XML PATH-Klausel
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
die benutzerdefinierte Funktion erzeugt die folgende XML (die @ Zeichen bewirkt, dass das SpecificDogNameId Feld als Attribut zurückgegeben werden)
<Dog SpecificDogNameId=99>Astro</Dog>
Nesting Benutzerdefinierte Funktionen des XML-Typ
Benutzerdefinierte Funktionen wie die oben udfGetLowestLevelNestedNode_SpecificDogName können verschachtelt werden, um eine leistungsfähige Methode zur Verfügung zu stellen komplexe XML zu erzeugen.
Zum Beispiel kann die Funktion
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
, wenn sie als
aufgerufenSELECT [dbo].[udfGetDogCollectionNode]()
könnte den komplexen XML-Knoten erzeugen (bei entsprechenden zugrunde liegenden Daten)
<DogCollection>
<Dog SpecificDogNameId="88">Dino</Dog>
<Dog SpecificDogNameId="99">Astro</Dog>
</DogCollection>
Von hier aus können Sie nach oben in dem verschachtelten Baum weiter arbeiten, wie komplex eine XML-Struktur zu bauen, wie Sie bitte
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
, wenn sie als
aufgerufenSELECT [dbo].[udfGetAnimalCollectionNode]()
die UDF könnte die komplexere XML-Knoten (angesichts der entsprechenden zugrunde liegenden Daten)
produzieren<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>
Andere Tipps
Können Sie etwas mehr darüber erzählen, was genau Sie planen zu tun. Ist es einfach die Erzeugung von XML-Daten basierend auf einem Inhalt der Tabelle oder das Hinzufügen einiger Daten aus der Tabelle zu einer vorhandenen XML-Struktur?
Es gibt große Serie von Artikeln über das Thema auf XML in SQLServer geschrieben von Jacob Sebastian, beginnt es mit der Grundlagen der Generierung von XML aus den Daten in die Tabelle
Verwenden Sie SQL: Spalte statt SQL: Variable. Hier können Sie detaillierte Informationen finden: http://msdn.microsoft.com/en -US / library / ms191214.aspx