Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Met SQL Server-ondersteuning voor het gegevenstype XML (Transact-SQL) kunt u desgewenst aanvragen dat het resultaat van een FOR XML-query als XML wordt geretourneerd door de TYPE-instructie op te geven. Hiermee kunt u het resultaat van een FOR XML-query op de server verwerken. U kunt bijvoorbeeld een XQuery opgeven, het resultaat toewijzen aan een xml-typevariabele of geneste FOR XML-query's schrijven.
Opmerking
SQL Server retourneert gegevens van het xml-gegevenstype naar de client als gevolg van verschillende serverconstructies, zoals FOR XML-query's die gebruikmaken van de TYPE-instructie, of waarbij het XML-gegevenstype wordt gebruikt om gegevenswaarden van het XML-exemplaar te retourneren uit kolommen en uitvoerparameters van SQL-tabellen. In clienttoepassingscode vraagt de ADO.NET-provider deze xml-gegevenstypegegevens op om te worden verzonden in een binaire codering van de server. Als u ECHTER FOR XML gebruikt zonder de TYPE-instructie, worden de XML-gegevens als tekenreekstype geretourneerd. In elk geval kan de clientprovider altijd een van beide vormen van XML verwerken. Houd er rekening mee dat VOOR XML op het hoogste niveau zonder de TYPE-instructie niet kan worden gebruikt met cursors.
Voorbeelden
In de volgende voorbeelden ziet u het gebruik van de TYPE-instructie met FOR XML-query's.
Ophalen van XML-queryresultaten als XML-type
Met de volgende query worden contactgegevens van klanten opgehaald uit de Contacts tabel. Omdat de TYPE instructie is opgegeven in FOR XML, wordt het resultaat geretourneerd als XML-type .
USE AdventureWorks2022;
Go
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
ORDER BY BusinessEntityID
FOR XML AUTO, TYPE;
Dit is het gedeeltelijke resultaat:
<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez"/>
<Person.Person BusinessEntityID="2" FirstName="Terri" LastName="Duffy"/>
...
FOR XML-queryresultaten toewijzen aan een xml-typevariabele
In het volgende voorbeeld wordt een FOR XML-resultaat toegewezen aan een xml-typevariabele. @x De query haalt contactgegevens op, zoals de BusinessEntityID, FirstNameen LastNameextra telefoonnummers, uit de AdditionalContactInfo kolom xmlTYPE. Omdat de FOR XML component richtlijn specificeert TYPE , wordt de XML geretourneerd als xml-type en wordt toegewezen aan een variabele.
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
Query's uitvoeren op resultaten van een FOR XML-query
De FOR XML-query's retourneren XML. Daarom kunt u xml-typemethoden , zoals query() en value(), toepassen op het XML-resultaat dat wordt geretourneerd door FOR XML-query's.
In de volgende query wordt de query() methode van het XML-gegevenstype gebruikt om het resultaat van de FOR XML query op te vragen. Zie query() Method (XML-gegevenstype) voor meer informatie.
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]');
De binnenste SELECT ... FOR XML query retourneert een xml-typeresultaat waarop de SELECT buitenste query() methode wordt toegepast op het XML-type. Let op de gespecificeerde TYPE-richtlijn.
Dit is het resultaat:
<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 de volgende query wordt de value() methode van het XML-gegevenstype gebruikt om een waarde op te halen uit het XML-resultaat dat door de SELECT...FOR XML query wordt geretourneerd. Zie value() Method (XML-gegevenstype) voor meer informatie.
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;
De XQuery-padexpressie in de value()-methode haalt het eerste telefoonnummer op van een klantcontact waarvan BusinessEntityID1 is.
Opmerking
Als de TYPE-instructie niet is opgegeven, wordt het RESULTAAT van de FOR XML-query geretourneerd als type nvarchar(max).
Gebruik FOR XML-queryresultaten in INSERT, UPDATE en DELETE (Transact-SQL DML)
In het volgende voorbeeld ziet u hoe FOR XML-query's kunnen worden gebruikt in DML-instructies (Data Manipulation Language). In het voorbeeld FOR XML wordt een exemplaar van het XML-type geretourneerd. Met INSERT de instructie wordt deze XML in een tabel ingevoegd.
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