FOR XML-Unterstützung für den xml-Datentyp
Wenn eine FOR XML-Abfrage eine Spalte des xml-Typs in der SELECT-Klausel angibt, werden die Spaltenwerte unabhängig davon, ob die ELEMENTS-Direktive angegeben wird, im zurückgegebenen XML als Elemente zugeordnet. XML-Deklarationen in einer Spalte des xml-Typs werden nicht serialisiert.
Die folgende Abfrage ruft z. B. Kundenkontaktinformationen, wie etwa die ContactID-, FirstName- und LastName-Spalten, und die Rufnummern aus der AdditionalContactInfo-Spalte ab, die vom Typ xml ist.
SELECT ContactID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') AS PhoneNumber
FROM Person.Contact
FOR XML AUTO, TYPE
Da die Abfrage nicht die ELEMENTS-Direktive angibt, werden die Spaltenwerte als Attribute zurückgegeben. Eine Ausnahme sind die Werte für die zusätzlichen Kontaktinformationen, die aus der Spalte vom Typ xml abgerufen werden. Diese werden als Elemente zurückgegeben.
Dies ist das Teilergebnis:
<Contact ContactID="1" FirstName="Syed" LastName="Abbas">
<act:number xmlns:act=
"http://schemas.adventure-works.com/AdditionalContactTypes">
111-111-1111</act:number>
<act:number xmlns:act=
"http://schemas.adventure-works.com/AdditionalContactTypes">
112-111-1111</act:number>
</Contact>
<Contact ContactID="2" FirstName="Catherine" LastName="Abel">
...
</Contact>
...
Wenn Sie einen Spaltenalias für die XML-Spalte angeben, die von der XQuery generiert wird, wird der Alias zum Hinzufügen eines Wrapperelements um das XML verwendet, das von der XQuery-Abfrage generiert wird. Die folgende Abfrage gibt z. B. MorePhoneNumbers als Spaltenalias an:
SELECT ContactID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') as MorePhoneNumbers
FROM Person.Contact
FOR XML AUTO, TYPE
Das von der XQuery-Abfrage zurückgegebene XML wird vom <MorePhoneNumbers
>-Element umschlossen, wie im folgenden Teilergebnis gezeigt wird:
<Contact ContactID="1" FirstName="Syed" LastName="Abbas">
<MorePhoneNumbers>
<act:number xmlns:act="http://schemas.adventure-works.com/AdditionalContactTypes">111-111-1111</act:number>
<act:number xmlns:act="http://schemas.adventure-works.com/AdditionalContactTypes">112-111-1111</act:number>
</MorePhoneNumbers>
</Contact>
<Contact ContactID="2" FirstName="Catherine" LastName="Abel">
<MorePhoneNumbers>
...
</MorePhoneNumbers>
</Contact>
...
Wenn Sie die ELEMENTS-Direktive in der Abfrage angeben, werden ContactID, LastName und FirstName als Elemente im sich ergebenden XML zurückgegeben.
Das folgende Beispiel zeigt, dass die FOR XML-Verarbeitungslogik XML-Deklarationen in den XML-Daten aus einer Spalte des xml-Typs nicht serialisiert:
create table t(i int, x xml)
go
insert into t values(1, '<?xml version="1.0" encoding="UTF-8" ?>
<Root SomeID="10" />')
select i, x
from t
for xml auto
Dies ist das Ergebnis. In diesem Ergebnis wird die XML-Deklaration <?xml version="1.0" encoding="UTF-8" ?
> nicht serialisiert.
<root>
<t i="1">
<x>
<Root SomeID="10" />
</x>
</t>
</root>
Zurückgeben von XML aus einer benutzerdefinierten Funktion
FOR XML-Abfragen können zum Zurückgeben von XML aus einer benutzerdefinierten Funktion verwendet werden, die eines der folgenden Objekte zurückgibt:
- Eine Tabelle mit einer einzelnen Spalte des Typs xml.
- Eine Instanz des xml-Typs.
Die folgende benutzerdefinierte Funktion gibt z. B. eine Tabelle mit einer einzelnen Spalte des xml-Typs zurück:
CREATE FUNCTION MyUDF (@ProudctModelID int)
RETURNS @T TABLE
(
ProductDescription xml
)
AS
BEGIN
INSERT @T
SELECT CatalogDescription.query('
declare namespace PD="https://www.adventure-works.com/schemas/products/description";
//PD:ProductDescription ')
FROM Production.ProductModel
WHERE ProductModelID = @ProudctModelID
RETURN
END
Sie können die benutzerdefinierte Funktion ausführen und die von dieser zurückgegebene Tabelle abfragen. In diesem Beispiel wird das durch Abfragen der Tabelle zurückgegebene XML einer Variablen vom Typ xml zugewiesen.
declare @x xml
set @x = (SELECT * FROM MyUDF(19))
select @x
Das folgende Beispiel zeigt eine weitere benutzerdefinierte Funktion. Diese benutzerdefinierte Funktion gibt eine Instanz des xml-Typs zurück. In diesem Beispiel gibt die benutzerdefinierte Funktion eine typisierte XML-Instanz zurück, weil der Schemanamespace angegeben wird.
drop function MyUDF4
go
CREATE FUNCTION MyUDF4 (@ProductModelID int)
RETURNS xml ([Production].[ProductDescriptionSchemaCollection])
AS
BEGIN
declare @x xml
set @x = ( SELECT CatalogDescription
FROM Production.ProductModel
WHERE ProductModelID = @ProductModelID )
return @x
END
Das durch die benutzerdefinierte Funktion zurückgegebene XML kann einer Variablen vom Typ xml wie folgt zugewiesen werden:
declare @x xml
SELECT @x= dbo.MyUDF4 (19)
select @x
Siehe auch
Verweis
FOR XML-Unterstützung für verschiedene SQL Server-Datentypen