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.

War es hilfreich?

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

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

aufgerufen
SELECT [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

aufgerufen
SELECT [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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top