TYPE-direktiv i FOR XML-frågor

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

SQL Server-stöd för xml (Transact-SQL) datatyp gör att du kan begära att resultatet av en FOR XML-fråga returneras som XML- genom att ange TYPE-direktivet. På så sätt kan du bearbeta resultatet av en FOR XML-fråga på servern. Till exempel kan du ange en XQuery för den, tilldela resultatet till en xml- typvariabel eller skriva kapslade FOR XML-frågor.

Not

SQL Server returnerar XML- datatypsinstansdata till klienten som ett resultat av olika serverkonstruktioner, till exempel FÖR XML-frågor som använder TYPE-direktivet, eller där xml- datatyp används för att returnera XML-instansdatavärden från SQL-tabellkolumner och utdataparametrar. I klientprogramkoden begär ADO.NET-providern den här xml- datatypsinformation som ska skickas i en binär kodning från servern. Men om du använder FOR XML utan TYPE-direktivet kommer XML-data tillbaka som en strängtyp. I vilket fall som helst kommer klientprovidern alltid att kunna hantera båda formerna av XML. Observera att den översta nivån för XML utan TYPE-direktivet inte kan användas med markörer.

Exempel

Följande exempel illustrerar användningen av TYPE-direktivet med FOR XML-frågor.

Hämtar FOR XML-frågeresultat som XML-typ

Följande fråga hämtar kundkontaktinformation från tabellen Contacts. Eftersom TYPE-direktivet anges i FOR XMLreturneras resultatet som xml- typ.

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

Detta är det partiella resultatet:

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

Tilldela FOR XML-frågeresultat till en xml-typvariabel

I följande exempel tilldelas ett FOR XML-resultat till en xml- typvariabel @x. Frågan hämtar kontaktinformation, till exempel BusinessEntityID, FirstName, LastNameoch ytterligare telefonnummer, från kolumnen AdditionalContactInfo i xml-TYPE. Eftersom FOR XML-satsen anger TYPE direktiv returneras XML som xml- typ och tilldelas till en variabel.

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

Fråga om resultatet av en FOR XML-fråga

FOR XML-frågorna returnerar XML. Därför kan du använda xml- typmetoder, till exempel query() och value(), på XML-resultatet som returneras av FOR XML-frågor.

I följande fråga används query()-metoden för xml- datatyp för att fråga resultatet av FOR XML frågan. Mer information finns i 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]');

Den inre SELECT ... FOR XML-frågan returnerar ett xml--typresultat som den yttre SELECT tillämpar metoden query()xml--typen. Observera det angivna TYPE-direktivet.

Det här är resultatet:

<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>

I följande fråga används value()-metoden för xml- datatyp för att hämta ett värde från XML-resultatet som returneras av den SELECT...FOR XML frågan. Mer information finns i 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;

XQuery-sökvägsuttrycket i metoden value() hämtar det första telefonnumret för en kundkontakt vars BusinessEntityID är 1.

Not

Om type-direktivet inte har angetts returneras FOR XML-frågeresultatet som typ nvarchar(max).

Använda FOR XML-frågeresultat i INSERT, UPDATE och DELETE (Transact-SQL DML)

I följande exempel visas hur FOR XML-frågor kan användas i DML-instruktioner (Data Manipulation Language). I exemplet returnerar FOR XML en instans av xml- typ. Instruktionen INSERT infogar den här XML-koden i en tabell.

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

Se även