Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
SQL-Datenbank in Microsoft Fabric
Die SQL Server-Unterstützung für den xml (Transact-SQL)-Datentyp ermöglicht es Ihnen, optional anzufordern, dass das Ergebnis einer FOR XML-Abfrage durch Angeben der -Direktive als TYPE 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-Abfragen dafü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 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ückgegeben. Der Clientanbieter ist in jedem Fall fähig, beide XML-Formate zu verarbeiten. Beachten Sie, dass FOR XML auf oberster Ebene ohne die TYPE Direktive nicht mit Cursorn verwendet werden kann.
Beispiele
Die folgenden Beispiele veranschaulichen die Verwendung der TYPE Direktive mit 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.
Hinweis
In Azure SQL-Datenbank und SQL Database in Microsoft Fabric ist die Anweisung USE nicht verfügbar. Stellen Sie stattdessen eine direkte Verbindung zur gewünschten Datenbank her und führen Sie den Rest des Codebeispiels aus.
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 ein FOR XML-Ergebnis einer Variablen vom Typ xml, @x, zugewiesen. Die Abfrage ruft Kontaktinformationen wie BusinessEntityID, FirstName, LastName und zusätzliche Telefonnummern aus der Spalte AdditionalContactInfo von xmlTYPE 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 eines Kundenkontakts ab, dessen BusinessEntityID1 ist.
Hinweis
Wenn die TYPE Direktive nicht angegeben ist, wird das FOR XML-Abfrageergebnis als Typ nvarchar(max)zurückgegeben.
Verwenden von FOR XML-Abfrageergebnissen in INSERT, UPDATEund DELETE (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