Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
SQL Server xml (Transact-SQL) adattípus támogatása lehetővé teszi, hogy opcionálisan kérje az XML-lekérdezés eredményének xml-ként való visszaadását az TYPE irányelv megadásával. Ez lehetővé teszi egy FOR XML-lekérdezés eredményének feldolgozását a kiszolgálón. Megadhat például egy XQuery-t, hozzárendelheti az eredményt egy xml típusú változóhoz, vagy írhat ágyazott FOR XML-lekérdezéseket.
Jegyzet
Az SQL Server a xml adattípus példányadatait különböző kiszolgálóoldali szerkezetek eredményeként adja vissza az ügyfélalkalmazásnak, például olyan FOR XML lekérdezések esetén, amelyek a TYPE direktívát használják, vagy amikor a xml adattípust az SQL-táblaoszlopokból és kimeneti paraméterekből származó XML-példányadatértékek visszaadására használják. Az ügyfélalkalmazás kódjában a ADO.NET szolgáltató kéri ezt a xml adattípus-információt, amelyet bináris kódolással kell elküldeni a kiszolgálóról. Ha azonban a FOR XML-t az TYPE irányelv nélkül használja, az XML-adatok sztringtípusként jelennek meg. Mindenesetre az ügyfélszolgáltató mindig képes lesz kezelni az XML bármelyik formáját. Vegye figyelembe, hogy az TYPE irányelv nélküli legfelső szintű XML-fájl nem használható kurzorokkal.
Példák
Az alábbi példák az irányelv HASZNÁLATÁT szemléltetik a TYPE FOR XML-lekérdezésekkel.
XML-lekérdezés eredményeinek lekérése XML-típusként
Az alábbi lekérdezés lekéri az ügyfél kapcsolattartási adatait a Contacts táblából. Mivel a TYPE irányelv FOR XMLvan megadva, az eredmény xml- típusként lesz visszaadva.
USE AdventureWorks2022;
Go
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
ORDER BY BusinessEntityID
FOR XML AUTO, TYPE;
Ez a részleges eredmény:
<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez"/>
<Person.Person BusinessEntityID="2" FirstName="Terri" LastName="Duffy"/>
...
AZ XML-lekérdezés eredményeinek hozzárendelése xml-típusváltozóhoz
Az alábbi példában a FOR XML-eredmény egy xml- típusú változóhoz van hozzárendelve, @x. A lekérdezés a BusinessEntityIDFirstNameLastName oszlopából lekéri a kapcsolattartási adatokat, például a AdditionalContactInfo, a , a TYPEés a további telefonszámokat. Mivel a FOR XML záradék TYPE irányelvet határoz meg, az XML xml- típusként lesz visszaadva, és egy változóhoz van rendelve.
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
XML-lekérdezés eredményeinek lekérdezése
A FOR XML lekérdezések XML-t adnak vissza. Ezért alkalmazhat típusú XML- metódusokat, például query() és value(), az XML-lekérdezések által visszaadott eredményre.
Az alábbi lekérdezésben a query() adattípus metódusa használható a FOR XML lekérdezés eredményének lekérdezéséhez. További információ: query() metódus (xml adattípus).
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]');
A belső SELECT ... FOR XML lekérdezés egy xml típusú eredményt ad vissza, amelyre a külső SELECT alkalmazza a query() metódust az xml típusra. Jegyezze meg a megadott TYPE direktívát.
Ez az eredmény:
<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>
A következő lekérdezésben az value() adattípus metódusa a SELECT...FOR XML lekérdezés által visszaadott XML-eredményből származó érték lekérésére szolgál. További információ: 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;
A value() módszer XQuery elérési út kifejezése lekéri annak az ügyfélnek az első telefonszámát, akinek a BusinessEntityID értéke 1.
Jegyzet
Ha az TYPE irányelv nincs megadva, a FOR XML-lekérdezés eredménye nvarchar(max) típusként lesz visszaadva.
Az FOR XML-lekérdezés lekérdezési eredményeinek használata a következőben: INSERT, UPDATE és DELETE (Transact-SQL DML)
Az alábbi példa bemutatja, hogyan használhatók az XML-lekérdezések az adatkezelési nyelvi (DML-) utasításokban. A példában a FOR XML egy xml- típusú példányt ad vissza. A INSERT utasítás beszúrja ezt az XML-t egy táblába.
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