TYPE-Direktive in FOR XML-Abfragen
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
SQL Server unterstützt den Datentyp xml (Transact-SQL) und ermöglicht es Ihnen damit, durch Angeben der TYPE-Direktive optional anzufordern, dass das Ergebnis einer FOR XML-Abfrage als xml-Datentyp 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 Instanzdaten des xml-Datentyps als Ergebnis verschiedener Serverkonstrukte wie FOR XML-Abfragen mit Verwendung der TYPE-Direktive an den Client zurück. Wenn der xml-Datentyp verwendet wird, gibt SQL Server XML-Instanzdatenwerte aus SQL-Tabellenspalten und -Ausgabeparametern zurück. Im Code der Clientanwendung erfordert der ADO.NET-Anbieter, dass die Informationen vom xml-Datentyp im Binärcode vom Server gesendet werden. 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 XML
angegeben 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 TYPE
xml 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. Folglich können Sie auf das von FOR XML-Abfragen zurückgegebene XML-Ergebnis Methoden vom Typ xml wie query()
und value()
anwenden.
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()-Methode (xml-Datentyp).
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()-Methode (xml-Datentyp).
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 BusinessEntityID
1
ab.
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