Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-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() på 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