Aracılığıyla paylaş


FOR XML sorgularında TYPE yönergesi

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

xml (Transact-SQL) veri türü için SQL Server desteği, isteğe bağlı olarak TYPE yönergesini belirterek FOR XML sorgusunun sonucunun xml olarak döndürüleceğini istemenizi sağlar. Bu, sunucuda for XML sorgusunun sonucunu işlemenizi sağlar. Örneğin, buna karşı bir XQuery belirleyebilir, sonucu bir xml türü değişkenine atayabilir veya FOR XML İç İçe sorgularıyazabilirsiniz.

Not

SQL Server, TYPE yönergesini kullanan FOR XML sorguları gibi farklı sunucu yapıları sonucunda veya XML örnek veri değerlerini SQL tablo sütunları ve çıkış parametrelerinden döndürmek için xml veri türünün kullanıldığı durumlarda xml veri türü örnek verilerini istemciye döndürür. İstemci uygulama kodunda, ADO.NET sağlayıcısı bu xml veri türü bilgilerinin sunucudan ikili kodlamada gönderilmesini istemektedir. Ancak, FOR XML'yi TYPE yönergesi olmadan kullanıyorsanız, XML verileri dize türü olarak geri döner. Her durumda, istemci sağlayıcısı her zaman XML'nin her iki biçimini de işleyebilir. TYPE yönergesi olmayan en üst düzey FOR XML'nin imleçlerle kullanılamadığını unutmayın.

Örnekler

Aşağıdaki örneklerde, FOR XML sorguları ile TYPE yönergesinin kullanımı gösterilmektedir.

XML türü olarak FOR XML sorgu sonuçlarını alma

Aşağıdaki sorgu, Contacts tablosundan müşteri iletişim bilgilerini alır. TYPE yönergesi FOR XMLiçinde belirtildiğinden, sonuç xml türü olarak döndürülür.

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

Kısmi sonuç şu şekildedir:

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

XML türü değişkenine FOR XML sorgu sonuçları atama

Aşağıdaki örnekte, bir FOR XML sonucu, xml türü değişkenine atanır, @x. Sorgu, BusinessEntityID, FirstName, LastNameve ek telefon numaraları gibi kişi bilgilerini AdditionalContactInfoTYPE sütunundan alır. FOR XML yan tümcesi TYPE yönergesini belirttiğinden, XML xml türü olarak döndürülür ve bir değişkene atanır.

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

FOR XML sorgusunun sonuçlarını sorgulama

FOR XML sorguları XML döndürür. Bu nedenle, FOR XML sorguları tarafından döndürülen XML sonucuna ve query()gibi value() türü yöntemleri uygulayabilirsiniz.

Aşağıdaki sorguda, query() sorgunun sonucunu sorgulamak için xml veri türünün FOR XML yöntemi kullanılır. Daha fazla bilgi için bkz. query() Metodu (xml Veri Türü).

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]');

İç SELECT ... FOR XML sorgusu, bir xml türü sonucunu döndürür ve dış SELECT, query() türüne yöntemini uygular. Belirtilen TYPE yönergesine dikkat edin.

Sonuç şu şekildedir:

<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şağıdaki sorguda, value() veri türünün yöntemi, SELECT...FOR XML sorgusu tarafından döndürülen XML sonucundan bir değer almak için kullanılır. Daha fazla bilgi için bkz. value() Metodu (xml Veri Türü).

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;

value() yöntemindeki XQuery yol ifadesi, BusinessEntityID'i 1olan bir müşteri irtibat kişisinin ilk telefon numarasını alır.

Not

TYPE yönergesi belirtilmezse, FOR XML sorgu sonucu nvarchar(max) türü olarak döndürülür.

FOR XML sorgusu kullanıldığında INSERT, UPDATE ve DELETE (Transact-SQL DML) sonuçları elde olur

Aşağıdaki örnek, FOR XML sorgularının Veri İşleme Dili (DML) deyimlerinde nasıl kullanılabileceğini gösterir. Örnekte, FOR XMLxml türünün bir örneğini döndürür. INSERT deyimi bu XML'i bir tabloya ekler.

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

Ayrıca bkz.