Aracılığıyla paylaş


Satır içi xsd şeması oluştur

for xml yan tümcesinde, sorgunuz Sorgu sonuçları ile birlikte bir satır içi şema dönmek isteyebilirsiniz. xdr şeması istiyorsanız, for xml yan tümcesinde xmldata anahtar sözcüğünü kullanın. Eğer bir xsd şeması, xmlschema anahtar sözcüğünü kullanın.

Bu konu, xmlschema anahtar açıklar ve elde edilen satır içi xsd şeması yapısını açıklar. Satır içi şemalar isterken sınırlamalar şunlardır:

  • raw ve auto modu, açık modunda yalnızca xmlschema belirtebilirsiniz.

  • İç içe for xml sorgu türü yönerge belirtiyorsa, sorgu sonucu olduğunu xmltürü ve bu sonuç yazılmamış xml veri örneği tedavi. Daha fazla bilgi için, bkz. DEL - Implementing XML in SQL Server.

for xml sorgu içinde xmlschema belirttiğiniz bir şema ve xml verilerini, sorgu sonucu alırsınız. Her üst düzey öğe verileri önceki şemaya başvuran, sırayla, satır içi şema hedef ad alanı için bir varsayılan ad alanı bildirimi kullanarak ifade eder.

Ö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="[AdventureWorks2012].[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ı ve xml sonuç içerir. <ProductModel> Sonuç en üst düzey öğe varsayılan ad alanı bildirimi, xmlns kullanarak şemaya başvurur = "urn: schemas-microsoft-com:sql:SqlRowSet1" .

Sonuçta şema bölümü birden fazla isim açıklamak birden çok şema belgesi içerebilir. En azından aşağıdaki iki şema belgeleri döndürülür:

  • Bir şema belgesi için Sqltypes ad ve hangi temel sql türleri döndürülür.

  • for xml sorgu sonucu şekli açıklayan başka bir şema belgesi.

Ayrıca, varsa yazılı xmlveri türleri sorgu sonucu, bu tip ile ilişkilendirilmiş şemaları dahil xmlveri türleri dahil.

for xml sonucu şekli açıklayan şema belgesinin hedef ad alanı sabit bölümü ve otomatik olarak artırır sayısal bir kısmını içerir. Bu ad biçimi aşağıda gösterilen yere n pozitif bir tamsayıdır. Örneğin, sorguda önceki, urn: schemas-microsoft-com:sql:SqlRowSet1 ise hedef ad alanı.

urn:schemas-microsoft-com:sql:SqlRowSetn

Başka bir yürütme oluşan sonuç hedef ad değişikliği arzu olmayabilir. Sonuç xml sorgu, örneğin, hedef ad değişikliği sorguyu güncelleştirmek gerektirecektir. xmlschema seçeneğini for xml yan tümcesi eklendiğinde, isteğe bağlı olarak bir hedef ad alanı belirtebilirsiniz. Sonuç xml sağladığınız ad yer alacak ve aynı olursa olsun kaç kez sorguyu çalıştırdığınızda kalacaktır.

SELECT ProductModelID, Name
FROM   Production.ProductModel
WHERE ProductModelID=1
FOR XML AUTO, XMLSCHEMA ('MyURI')

Varlık unsurları

Sorgu sonucu oluşturulan xsd şema yapısının ayrıntılarını görüşmek üzere, varlık öğesi ilk açıklanan vardır

Varlık unsuru for xml sorgu tarafından döndürülen xml veri tablo ve sütun değil üreten bir öğedir. Örneğin, kişi bilgilerini aşağıdaki for xml sorgu döndürür Personiçinde masa AdventureWorks2012veritabanı.

SELECT BusinessEntityID, FirstName
FROM Person.Person
WHERE BusinessEntityID = 1
FOR XML AUTO, ELEMENTS

Sonuç şudur:

<Person>

<BusinessEntityID>1</BusinessEntityID>

<FirstName>Ken</FirstName>

</Person>

Bu sonuç, <Person> varlık öğedir. xml sonucu birden çok varlık unsurları olabilir ve her bu satır içi xsd şeması içinde küresel bir bildiri vardır. Örneğin, satış siparişi başlığı ve detay bilgileri belirli bir siparişi için aşağıdaki sorgu 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

ÖĞELERI yönergesi sorgu belirtir, sonuç xml öğesi merkezli çünkü. Sorgu ayrıca xmlschema yönergesi belirtir. Bu nedenle, satır içi xsd şeması döndürülür. Sonuç şudur:

<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ç, <SalesOrderHeader> ve <SalesOrderDetail> varlık öğeleridir. Bu nedenle, onlar genel şemada bildirilir. Yani en üst düzeyde içinde bildirimi görünür <Schema> öğesi.

  • <SalesOrderID>, <ProductID>, Ve <OrderQty> sütunları eşleştirmek için varlık öğeleri, değildir. Sütun veri öğeleri XML ÖĞELERI yönergesi nedeniyle döndürülür. Bunlar yerel unsurların varlığı öğenin karmaşık türü için eşleştirilir. ÖĞELERI yönergesi belirtilmezse, dikkat, SalesOrderID, ProductIDve OrderQtyilgili varlık öğenin karmaşık tür yerel öznitelikler için değerler eşleştirilir.

Öznitelik adı Clashes

Aşağıdaki tartışma esas CustOrderve CustOrderDetailtabloları. Aşağıdaki örnekleri test etmek için bu tabloları oluşturma ve kendi örnek verileri ekleyin:

CREATE TABLE CustOrder (OrderID int primary key, CustomerID int)
GO
CREATE TABLE CustOrderDetail (OrderID int, ProductID int, Qty int)
GO

for XML'de aynı adı bazen farklı özellikleri, öznitelikleri belirtmek için kullanılır. Örneğin, aşağıdaki öznitelik merkezli raw modunda sorgu adı aynı SiparişNo iki öznitelik oluşturur. Bu bir hata üretir.

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 öğe için kabul edilebilir olduğundan, ÖĞELERI yönergesi 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. Not satır içi xsd şeması OrderID öğesi iki kez tanımlanır. MinOccurs OrderID CustOrderDetail tablosundan karşılık gelen 0 olarak ayarlayın ve beyanlar sahip ve SiparişNo birincil anahtar sütunu için ikinci eşler CustOrderminOccurs 1 varsayılan olduğu tablo.

<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ı Clashes

for XML'de aynı adlı iki alt öğelerini belirtmek için kullanılır. Örneğin, ürünler ListPrice ve DealerPrice değerleri aşağıdaki sorgu alır, ancak diğer aynı adı, fiyatı, bu iki sütunu sorgu belirtir. Bu nedenle, sonuç satır kümesi iki sütun aynı ada sahip olacaktır.

Durum 1: Her iki alt öğelerini aynı türden nonkey sütunlar ve boş olabilir

Aşağıdaki sorgu her iki alt öğelerini aynı türden nonkey sütunlar ve boş 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

Oluşturulan ilgili xml budur. Satır içi xsd yalnızca bir kısmını gösterilmiştir:

<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ı aşağıdakileri unutmayın:

  • Aynı tip, ListPrice hem DealerPrice olan money, ve her iki tabloda boş olabilir. Bu nedenle, onlar sonuç xml döndürülebilir değil çünkü, orada sadece bir <Price> alt öğenin karmaşık türü bildirimindeki <row> minOccurs sahip öğesi = 0 ve maxOccurs = 2.

  • Sonuç, çünkü DealerPricetablosunda yalnızca null değerdir ListPriceolarak dönen bir <Price>öğesi. Eğer XSINILparametre öğeleri yönergesi, her ikisi de sahip öğeleri alacaksınız xsi:nil değeri true olarak ayarlanmış <Price> DealerPrice için karşılık gelen öğe. Sen-ecek da almak iki <Price> alt öğeleri <row> satır içi xsd şeması ile karmaşık tür tanımında nillableöznitelik kümesi true hem. Bu parça kısmi bir sonucudur:

<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: Bir anahtar ve aynı türde bir nonkey sütun

Aşağıdaki sorgu, bir anahtar ve aynı türde bir nonkey sütun gösterilmiştir.

CREATE TABLE T (Col1 int primary key, Col2 int, Col3 nvarchar(20))
go
INSERT INTO T VALUES (1, 1, 'test')
go 

Tablo karşı aşağıdaki sorguyu t Col1 ve where Col1 birincil anahtar ve null olamaz ve Col2-ebilmek var olmak boş Col2, aynı diğer ada belirtir. Bu çocukları olan iki kardeş öğe oluşturur <row> öğesi.

SELECT Col1 as Col, Col2 as Col, Col3
FROM T
FOR XML RAW, ELEMENTS, XMLSCHEMA

Sonuç budur. Satır içi xsd şeması yalnızca bir parçası gösterilmektedir.

<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>

Not satır içi xsd şeması, <Col> Col2 karşılık gelen öğe vardır minOccurs 0 olarak ayarlayın.

Durum 3: Her iki öğeleri farklı türleri ve karşılık gelen sütun boş olabilir

Durum 2'de gösterilen örnek tablo karşı belirtilen aşağıdaki sorgu:

SELECT Col1, Col2 as Col, Col3 as Col
FROM T
FOR XML RAW, ELEMENTS, XMLSCHEMA

Aşağıdaki sorgu, Col2 ve Col3 aynı adlar verilir. Bu, aynı ada sahip ve iki çocukları olan iki kardeş öğe oluşturur <raw> sonuç öğesi. Her ikisi de bu sütunlar farklı türleri vardır ve her ikisi de boş olabilir. Sonuç budur. Yalnızca kısmi satır içi xsd şeması gösterilmiştir.

<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ı aşağıdakileri unutmayın:

  • null, Col2 ve Col3 olabileceğinden <Col> öğe bildirimi minOccurs 0 ve 2 olarak maxOccurs olarak belirtir.

  • Çünkü hem <Col> öğeleri olan kardeşler, orada bir öğe bildirimini şema. Ayrıca, her ikisi de elemanları da farklı türde olduğundan, hem though basit türler, şema öğe türü xsd:anySimpleType. Her örnek türü tanımlanır sonucu, xsi:typeözniteliği.

  • Sonuç, her örneğini <Col> öğesi başvuran için örnek türünü kullanarak xsi:typeözniteliği.