Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Database
Microsoft Fabric'te SQL veritabanı
FOR XML yan tümcesinde, sorgunuzun sorgu sonuçlarıyla birlikte satır içi şema döndürmesini isteyebilirsiniz. XDR şeması istiyorsanız, FOR XML yan tümcesinde XMLDATA anahtar sözcüğünü kullanırsınız. XSD şeması istiyorsanız XMLSCHEMA anahtar sözcüğünü kullanırsınız.
Bu makalede XMLSCHEMA anahtar sözcüğü açıklanır ve sonuçta elde edilen satır içi XSD şemasının yapısı açıklanır. Satır içi şemalar istediğinizde sınırlamalar şunlardır:
XMLSCHEMA'yı YALNıZCA RAW ve AUTO modunda belirtebilir, AÇIK modda belirtemezsiniz.
İç içe yerleştirilmiş bir FOR XML sorgusu TYPE yönergesini belirtiyorsa, sorgu sonucu xml türündedir ve bu sonuç, yazılmamış XML verilerinin bir örneği olarak kabul edilir. Daha fazla bilgi için bkz. XML Verileri (SQL Server).
FOR XML sorgusunda XMLSCHEMA belirttiğinizde, hem şema hem de XML verileri alırsınız, sorgu sonucu. Verilerin her üst düzey öğesi, satır içi şemanın hedef ad alanına başvuran varsayılan ad alanı bildirimini kullanarak önceki şemaya başvurur.
Örneğin:
<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="Production.ProductModel">
<xsd:complexType>
<xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
<xsd:attribute name="Name" use="required">
<xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks2022].[dbo].[Name]">
<xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
<xsd:maxLength value="50" />
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<Production.ProductModel xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="1" Name="Classic Vest" />
Sonuç XML şemasını ve XML sonucunu içerir. Sonuçtaki <ProductModel> üst düzey öğesi, xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" varsayılan ad alanı bildirimini kullanarak şemaya başvurur.
Sonucun şema bölümü, birden çok ad alanını açıklayan birden çok şema belgesi içerebilir. En azından aşağıdaki iki şema belgesi döndürülür:
Sqltypes ad alanı için ve temel SQL türlerinin döndürülmekte olduğu bir şema belgesi.
FOR XML sorgu sonucunun şeklini açıklayan başka bir şema belgesi.
Ayrıca, yazılan xml veri türleri sorgu sonucuna dahil edilirse, bu yazılan xml veri türleriyle ilişkili şemalar eklenir.
FOR XML sonucunun şeklini açıklayan şema belgesinin hedef ad alanı, sabit bir bölüm ve otomatik olarak artan sayısal bir bölüm içerir. Bu ad alanının formatı aşağıda gösterilmiştir, burada n pozitif bir tamsayıdır. Örneğin, önceki sorguda hedef ad alanı urn:schemas-microsoft-com:sql:SqlRowSet1'dir.
urn:schemas-microsoft-com:sql:SqlRowSetn
Bir yürütmeden diğerine yapılan sonuçtaki hedef ad alanlarının değiştirilmesi istenmeyebilir. Örneğin, sonuçta elde edilen XML'yi sorgularsanız, hedef ad alanında yapılan değişiklik sorgunuzu güncelleştirmenizi gerektirir. FOR XML yan tümcesine XMLSCHEMA seçeneği eklendiğinde isteğe bağlı olarak bir hedef ad alanı belirtebilirsiniz. Sonuçta elde edilen XML, sağladığınız ad alanını içerir ve sorguyu kaç kez çalıştırdığınızdan bağımsız olarak aynı kalır.
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=1
FOR XML AUTO, XMLSCHEMA ('MyURI');
Varlık öğeleri
Sorgu sonucu için oluşturulan XSD şema yapısının ayrıntılarını tartışmak için önce varlık öğesinin açıklanması gerekir
FOR XML sorgusu tarafından döndürülen XML verilerindeki varlık öğesi, sütundan değil, tablodan oluşturulan bir öğedir. Örneğin, aşağıdaki FOR XML sorgusu, Person veritabanındaki AdventureWorks2025 tablosundan kişi bilgilerini döndürür.
SELECT BusinessEntityID, FirstName
FROM Person.Person
WHERE BusinessEntityID = 1
FOR XML AUTO, ELEMENTS;
Sonuç şu şekildedir:
<Person>
<BusinessEntityID>1</BusinessEntityID>
<FirstName>Ken</FirstName>
</Person>
Bu sonuçta, <Person> varlık öğesidir. XML sonucunda birden çok varlık öğesi olabilir ve bunların her birinin satır içi XSD şemasında genel bir bildirimi vardır. Örneğin, aşağıdaki sorgu belirli bir siparişin satış siparişi üst bilgisini ve ayrıntı bilgilerini alır.
SELECT SalesOrderHeader.SalesOrderID, ProductID, OrderQty
FROM Sales.SalesOrderHeader, Sales.SalesOrderDetail
WHERE SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
AND SalesOrderHeader.SalesOrderID=5001
FOR XML AUTO, ELEMENTS, XMLSCHEMA;
Sorgu ELEMENTS yönergesini belirttiğinden, sonuçta elde edilen XML öğe merkezlidir. Sorgu ayrıca XMLSCHEMA yönergesini belirtir. Bu nedenle, satır içi bir XSD şeması döndürülür. Sonuç şu şekildedir:
<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="Sales.SalesOrderHeader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="SalesOrderID" type="sqltypes:int" />
<xsd:element ref="schema:Sales.SalesOrderDetail" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Sales.SalesOrderDetail">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ProductID" type="sqltypes:int" />
<xsd:element name="OrderQty" type="sqltypes:smallint" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Önceki sorgudan aşağıdakilere dikkat edin:
Sonuç olarak,
<SalesOrderHeader>ve<SalesOrderDetail>varlık öğeleridir. Bu nedenle, bunlar şemada genel olarak bildirildi. Diğer bir ifadeyle bildirim,<Schema>öğesinin en üst düzeyinde görünür.<SalesOrderID>,<ProductID>ve<OrderQty>, sütunlara eş olduklarından varlık öğeleri değildir. Sütun verileri, ELEMENTS yönergesi nedeniyle XML'de öğeler olarak döndürülür. Bunlar varlık öğesinin karmaşık türünün yerel öğelerine eşlenir. ELEMENTS yönergesi belirtilmezse,SalesOrderID,ProductIDveOrderQtydeğerleri ilgili varlık öğesinin karmaşık türünün yerel özniteliklerine eşlenir.
Öznitelik adı çakışmaları
Aşağıdaki tartışma CustOrder ve CustOrderDetail tablolarını temel alır. Aşağıdaki örnekleri test etmek için bu tabloları oluşturun ve kendi örnek verilerinizi ekleyin:
CREATE TABLE CustOrder (OrderID int primary key, CustomerID int);
GO
CREATE TABLE CustOrderDetail (OrderID int, ProductID int, Qty int);
GO
FOR XML'de, bazen farklı özellikleri, öznitelikleri belirtmek için aynı ad kullanılır. Örneğin, aşağıdaki öznitelik merkezli RAW modu sorgusu aynı ada sahip iki öznitelik oluşturur: OrderID. Bu bir hata oluşturur.
SELECT CustOrder.OrderID,
CustOrderDetail.ProductID,
CustOrderDetail.OrderID
FROM dbo.CustOrder, dbo.CustOrderDetail
WHERE CustOrder.OrderID = CustOrderDetail.OrderID
FOR XML RAW, XMLSCHEMA;
Ancak, aynı ada sahip iki öğeye sahip olmak kabul edilebilir olduğundan, ELEMENTS yönergesini ekleyerek sorunu ortadan kaldırabilirsiniz:
SELECT CustOrder.OrderID,
CustOrderDetail.ProductID,
CustOrderDetail.OrderID
from dbo.CustOrder, dbo.CustOrderDetail
where CustOrder.OrderID = CustOrderDetail.OrderID
FOR XML RAW, XMLSCHEMA, ELEMENTS;
Sonuç budur. Satır içi XSD şemasında OrderID öğesinin iki kez tanımlandığını unutmayın. Bildirimlerden birinde custOrderDetail tablosundaki OrderID'ye karşılık gelen minOccurs değeri 0 olarak ayarlanmış, ikincisi ise minOccurs'un varsayılan olarak 1 olduğu CustOrder tablosunun OrderID birincil anahtar sütunuyla eşlenir.
<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="row">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="OrderID" type="sqltypes:int" />
<xsd:element name="ProductID" type="sqltypes:int" minOccurs="0" />
<xsd:element name="OrderID" type="sqltypes:int" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Öğe adı çakışmaları
FOR XML'de, iki alt öğeyi belirtmek için aynı ad kullanılabilir. Örneğin, aşağıdaki sorgu ürünlerin ListPrice ve DealerPrice değerlerini alır, ancak sorgu bu iki sütun için aynı diğer adı (Price) belirtir. Bu nedenle, sonuçta elde edilen satır kümesi, adına göre aynı olan iki sütun içerir.
Olay 1: Her iki alt öğe de aynı türde anahtar olmayan sütunlardır ve NULL olabilir
Aşağıdaki sorguda, her iki alt öğe de aynı türde anahtar olmayan sütunlardır ve NULL olabilir.
DROP TABLE T;
GO
CREATE TABLE T (ProductID int primary key, ListPrice money, DealerPrice money);
GO
INSERT INTO T values (1, 1.25, null);
GO
SELECT ProductID, ListPrice Price, DealerPrice Price
FROM T
for XML RAW, ELEMENTS, XMLSCHEMA;
Bu, oluşturulan karşılık gelen XML'dir. Satır içi XSD'nin yalnızca bir bölümü gösterilir:
...
<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" />
<xsd:element name="row">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ProductID" type="sqltypes:int" />
<xsd:element name="Price" type="sqltypes:money" minOccurs="0" maxOccurs="2" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1">
<ProductID>1</ProductID>
<Price>1.2500</Price>
</row>
Satır içi XSD şemasında aşağıdakilere dikkat edin:
Hem ListPrice hem de DealerPrice aynı türdedir,
moneyve her ikisi de tabloda NULL olabilir. Bu nedenle, elde edilen XML'de döndürülmemeleri olası olduğundan,<Price>ve<row>'e sahip olanminOccurs=0öğesinin karmaşık tür bildiriminde yalnızca birmaxOccurs=2alt öğesi vardır.Sonuçta, tabloda
DealerPricedeğeri NULL olduğundan, yalnızcaListPrice<Price>öğesi olarak döndürülür.XSINILparametresini ELEMENTS yönergesine eklerseniz, DealerPrice'e karşılık gelenxsi:nilöğesi için<Price>değeri TRUE olarak ayarlanmış her iki öğeyi de alırsınız. Ayrıca, her ikisi için de<Price>özniteliği TRUE olarak ayarlanmış satır içi XSD şemasındaki<row>karmaşık tür tanımında ikinillablealt öğe alırsınız. Bu parça kısmi bir sonuçdur:
...
<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" />
<xsd:element name="row">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ProductID" type="sqltypes:int" nillable="1" />
<xsd:element name="Price" type="sqltypes:money" nillable="1" />
<xsd:element name="Price" type="sqltypes:money" nillable="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ProductID>1</ProductID>
<Price>1.2500</Price>
<Price xsi:nil="true" />
</row>
Durum 2: Aynı türde bir anahtar ve bir anahtar olmayan sütun
Aşağıdaki sorguda aynı türde bir anahtar ve anahtar olmayan bir sütun gösterilmektedir.
CREATE TABLE T (Col1 int primary key, Col2 int, Col3 nvarchar(20));
GO
INSERT INTO T VALUES (1, 1, 'test');
GO
Tablo T üzerinde aşağıdaki sorgu, Col1 ve Col2 için aynı diğer adı belirtir. Burada Col1 birincil anahtardır ve null olamaz, Col2 ise null olabilir. Bu, <row> öğesinin alt öğesi olan iki eşdüzey öğe oluşturur.
SELECT Col1 as Col, Col2 as Col, Col3
FROM T
FOR XML RAW, ELEMENTS, XMLSCHEMA
Sonuç budur. Satır içi XSD şemasının yalnızca bir parçası gösterilir.
...
<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" />
<xsd:element name="row">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Col" type="sqltypes:int" />
<xsd:element name="Col" type="sqltypes:int" minOccurs="0" />
<xsd:element name="Col3" minOccurs="0">
<xsd:simpleType>
<xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
<xsd:maxLength value="20" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1">
<Col>1</Col>
<Col>1</Col>
<Col3>test</Col3>
</row>
Satır içi XSD şemasında Col2'ye karşılık gelen <Col> öğesinin minOccurs değerinin 0 olarak ayarlandığını unutmayın.
3. Olay: Hem farklı türlerdeki öğeler hem de karşılık gelen sütunlar NULL olabilir
2 durumunda gösterilen örnek tabloda aşağıdaki sorgu belirtilir:
SELECT Col1, Col2 as Col, Col3 as Col
FROM T
FOR XML RAW, ELEMENTS, XMLSCHEMA;
Aşağıdaki sorguda, Col2 ve Col3'e aynı diğer adlar verilir. Bu, aynı ada sahip ve sonuçtaki <raw> öğesinin alt öğeleri olan iki eşdüzey öğe oluşturur. Bu sütunların her ikisi de farklı türlerdedir ve her ikisi de NULL olabilir. Sonuç budur. Yalnızca kısmi satır içi XSD şeması gösterilir.
...
<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" />
<xsd:simpleType name="Col1">
<xsd:restriction base="sqltypes:int" />
</xsd:simpleType>
<xsd:simpleType name="Col2">
<xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
<xsd:maxLength value="20" />
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="row">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Col1" type="sqltypes:int" />
<xsd:element name="Col" minOccurs="0" maxOccurs="2" type="xsd:anySimpleType" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1">
<Col1>1</Col1>
<Col xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Col1">1</Col>
<Col xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Col2">test</Col>
</row>
Satır içi XSD şemasında aşağıdakilere dikkat edin:
Hem Col2 hem de Col3 NULL olabileceğinden,
<Col>öğe bildirimi minOccurs değerini 0 ve maxOccurs değerini 2 olarak belirtir.her iki
<Col>öğesi de eşdüzey olduğundan, şemada bir öğe bildirimi vardır. Ayrıca, her iki öğe de farklı türlerde olduğundan, her ikisi de basit türler olduğundan, şemadaki öğenin türüxsd:anySimpleType. Sonuç olarak, her örnek türüxsi:typeözniteliği tarafından tanımlanır.Sonuç olarak,
<Col>öğesinin her örneğixsi:typeözniteliğini kullanarak örnek türüne başvurur.