TYPE-Direktive in FOR XML-Abfragen

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Die SQL Server-Unterstützung für den XML-Datentyp (Transact-SQL) ermöglicht es Ihnen, optional anzufordern, dass das Ergebnis einer FOR XML-Abfrage durch Angeben der TYPE-Direktive als XML zurückgegeben wird. Dies ermöglicht Ihnen, das Ergebnis einer FOR XML-Abfrage auf dem Server zu verarbeiten. So können Sie beispielsweise eine XQuery dafür angeben, das Ergebnis einer Variablen vom Typ xml zuweisen oder geschachtelte FOR XML-Abfragendafür schreiben.

Hinweis

SQL Server gibt xml-Datentypinstanzdaten als Ergebnis verschiedener Serverkonstrukte an den Client zurück, z. B. FOR XML-Abfragen, die die TYPE-Direktive verwenden, oder wenn der XML-Datentyp verwendet wird, um XML-Instanzdatenwerte aus SQL-Tabellenspalten und Ausgabeparametern zurückzugeben. Im Clientanwendungscode fordert der ADO.NET Anbieter diese XML-Datentypinformationen an, die in einer binären Codierung vom Server gesendet werden sollen. Wenn Sie jedoch FOR XML ohne die TYPE-Direktive verwenden, werden die XML-Daten als Zeichenfolgentyp zurückgesendet. Der Clientanbieter ist in jedem Fall fähig, beide XML-Formate zu verarbeiten. Beachten Sie, dass FOR XML der obersten Ebene ohne die TYPE-Direktive nicht mit Cursorn verwendet werden kann.

Beispiele

Die folgenden Beispiele veranschaulichen die Verwendung der TYPE-Direktive für FOR XML-Abfragen.

Abrufen von FOR XML-Abfrageergebnissen als XML-Typ

Die folgende Abfrage ruft Informationen zu Kundenkontakten aus der Contacts -Tabelle auf. Da die TYPE -Direktive in FOR XMLangegeben ist, wird das Ergebnis als xml -Typ zurückgegeben.

USE AdventureWorks2022;
Go
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
ORDER BY BusinessEntityID
FOR XML AUTO, TYPE;

Dies ist das Teilergebnis:

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez"/>
<Person.Person BusinessEntityID="2" FirstName="Terri" LastName="Duffy"/>
...

Zuweisen von FOR XML-Abfrageergebnissen zu einer Variablen vom Typ XML

Im folgenden Beispiel wird das Ergebnis einer FOR XML-Abfrage zugewiesen, einer Variablen vom Typ xml @x. Die Abfrage ruft Kontaktinformationen wie z.B. BusinessEntityID, FirstName, LastName sowie zusätzliche Telefonnummern aus der AdditionalContactInfo-Spalte mit TYPExml ab. Da die FOR XML -Klausel die TYPE -Direktive angibt, werden die XML-Daten als xml -Typ zurückgegeben und einer Variablen zugewiesen.

USE AdventureWorks2022;
GO
DECLARE @x xml;
SET @x = (
   SELECT BusinessEntityID,
          FirstName,
          LastName,
          AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
              //act:telephoneNumber/act:number') as MorePhoneNumbers
   FROM Person.Person
   FOR XML AUTO, TYPE);
SELECT @x;
GO

Abfragen von Ergebnissen einer FOR XML-Abfrage

FOR XML-Abfragen geben XML-Daten zurück. Daher können Sie xml-Typmethoden, zquery(). B. und value(), auf das XML-Ergebnis anwenden, das von FOR XML-Abfragen zurückgegeben wird.

In der folgenden Abfrage wird die query() -Methode des xml -Datentyps verwendet, um das Ergebnis der FOR XML -Abfrage abzufragen. Weitere Informationen finden Sie unter "query() Method (xml Data Type)".

USE AdventureWorks2022;
GO
SELECT (SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
DECLARE namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
DECLARE namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') AS PhoneNumbers
FROM Person.Person
FOR XML AUTO, TYPE).query('/Person.Person[1]');

Die innere SELECT ... FOR XML -Abfrage gibt ein Ergebnis vom Typ xml zurück, auf das die äußere SELECT -Abfrage die query() -Methode vom Typ xml anwendet. Beachten Sie, dass die TYPE -Direktive angegeben ist.

Dies ist das Ergebnis:

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez">
  <PhoneNumbers>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">111-111-1111</act:number>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">112-111-1111</act:number>
  </PhoneNumbers>
</Person.Person>

In der folgenden Abfrage wird die value() -Methode des Datentyps xml verwendet, um einen Wert aus dem XML-Ergebnis einer SELECT...FOR XML -Abfrage abzurufen. Weitere Informationen finden Sie unter value() Method (xml Data Type).For more information, see value() Method (xml Data Type).

USE AdventureWorks2022;
GO
DECLARE @FirstPhoneFromAdditionalContactInfo varchar(40);
SELECT @FirstPhoneFromAdditionalContactInfo =
( SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
   //act:telephoneNumber/act:number
   ') AS PhoneNumbers
   FROM Person.Person Contact
   FOR XML AUTO, TYPE).value('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
  /Contact[@BusinessEntityID="1"][1]/PhoneNumbers[1]/act:number[1]', 'varchar(40)'
);
SELECT @FirstPhoneFromAdditionalContactInfo;

Der XQuery-Pfadausdruck in der value() -Methode ruft die erste Telefonnummer des Kundenkontakts mit der BusinessEntityID1ab.

Hinweis

Wenn die TYPE-Direktive nicht angegeben ist, wird das Ergebnis der FOR XML-Abfrage als nvarchar(max)zurückgegeben.

Verwenden von FOR XML-Abfrageergebnissen in INSERT-, UPDATE- und DELETE-Anweisungen (Transact-SQL-DML)

Das folgende Beispiel stellt dar, wie FOR XML-Abfragen in DML-Anweisungen (DML, Data Manipulation Language) verwendet werden können. In diesem Beispiel gibt die FOR XML -Abfrage eine Instanz vom Typ xml zurück. Die INSERT -Anweisung fügt diese XML-Daten in eine Tabelle ein.

CREATE TABLE T1(intCol int, XmlCol xml);
GO
INSERT INTO T1
VALUES(1, '<Root><ProductDescription ProductModelID="1" /></Root>');
GO

CREATE TABLE T2(XmlCol xml)
GO
INSERT INTO T2(XmlCol)
SELECT (SELECT XmlCol.query('/Root')
        FROM T1
        FOR XML AUTO,TYPE);
GO

Siehe auch