Aracılığıyla paylaş


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

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

Bu konuda, xmlschema anahtar sözcük açıklar ve elde edilen satır içi xsd şeması yapısını açıklar.Satır içi şemalar isterken kısıtlamaları şunlardır:

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

  • İç içe for xml sorgu türü yönergeyi belirtir, sorgu sonucu olarak ise xml türü ve bu sonuç kabul bir örnek untyped xml verileri.Daha fazla bilgi için bkz: SQL Server'da xml uygulama.

for xml sorgu içinde xmlschema belirttiğinizde, şema ve xml verilerini, sorgu sonucu alırsınız.Her üst düzey öğe verileri, önceki şemaya başvuran, sırasıyla satır içi şema hedef ad alanı için varsayılan bir ad alaný bildirim 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="[AdventureWorks2008R2].[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 sonuçlarını içerir.The <ProductModel> top-level element in the result refers to the schema by using the default namespace declaration, xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" .

Sonucu şema bölümünü birden çok ad alanını tanımlayan 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 iade edilen.

  • for xml sorgu sonucu şeklini tanımlayan başka bir şema belgesi.

Ayrıca, varsa yazılı xml veri türleri dahil yazılı olanlar ile ilişkilendirilmiş şemaları sorgu sonuç xml veri türleri eklenmiştir.

for xml sonuç şeklini açıklayan şema belgesinin hedef ad alanı sabit bir bölümü ve otomatik olarak artırır sayısal bir bölümünü içerir.Aşağıda, bu ad biçimini gösterilen yere n sıfırdan büyük 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 edilmeyebilir.Sonuç xml sorgulama yapıyorsanız, örneğin, hedef ad alanı değişikliği sorgunuzu güncelleştirme gerektirir.xmlschema seçeneğini for xml yan tümce tümce tümcesinde eklendiğinde, isteğe bağlı olarak bir hedef ad alanı belirtebilirsiniz.Sonuç xml sağladığınız ad alanına dahil edilir ve aynı bağımsız olarak kaç kez sorguyu çalıştırmak kalır.

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

Varlık öğeleri

Ayrıntılar için sorgu sonucu oluşturulan xsd şema yapısının tartışmak için varlık öğesi ilk olarak açıklanan sahiptir

Bir varlık for xml sorgu tarafından döndürülen xml verileri öğenin oluşturulduğu öğedir bir tablo değil, bir sütun.Örneğin, kişi bilgilerini aşağıdaki for xml sorgu döndürür Person , tablo AdventureWorks2008R2 veritabanı.

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

Bu sonucu verir:

<Person>

<BusinessEntityID>1</BusinessEntityID>

<FirstName>Ken</FirstName>

</Person>

Bu sonuç, <Person> olan varlık öğesi.xml sonucu birden çok varlık öğesi olabilir ve bunların her biri bir genel olan bildirim , satır içi xsd şeması.Ö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

Sorgu öğeleri yönergeyi belirtir, sonuç xml öğesi merkezli çünkü.Sorgu xmlschema yönergesi de belirtir.Bu nedenle, bir satır içi xsd şeması döndürülür.Bu sonucu verir:

<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> olan varlık öğeleri.Bu nedenle, bunlar genel olarak şemada bildirilir.Diğer bir deyişle, bildirimn en üstünde görünür düzey içinde <Schema> öğesi.

  • The <SalesOrderID>, <ProductID>, and <OrderQty> are not entity elements, because they map to columns.Sütun veri ÖĞELERİNİ yönergesi nedeniyle xml öğeleri olarak döndürülür.Bu varlık öðenin karmaþýk tür yerel öğelere eşleştirilir.ÖĞELERİ yönergesi belirtilmezse, dikkat edin, SalesOrderID, ProductID ve OrderQty değerler eşleştirilir yerel özniteliklerinin ilgili varlık öðenin karmaþýk türü.

Öznitelik adı çatışmayı

Aşağıdaki tartışma esas CustOrder ve CustOrderDetail tablolar.Aşağıdaki örnekleri test etmek için bu tabloları oluşturun 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ı özellikler, öznitelikleri belirtmek için kullanılır.Örneğin, aşağıdaki öznitelik merkezli Ham modu sorgusu SiparişNo aynı ada sahip 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ğu için öğ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.İçinde satır içi xsd şeması, iki kez tanımlanan öğe SiparişNo unutmayın.Bildirimleri sahip minOccurs 0, OrderID olarak CustOrderDetail tablosundan karşılık gelen küme ve SiparişNo birincil anahtar ikinci eşler sütun , CustOrder Tablo burada minOccurs, varsayılan olarak 1

<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ı çatışmayı

for XML'de aynı adlı iki alt öğelerini belirtmek için kullanılabilir.Örneğin, aşağıdaki sorgu ürünlerin ListPrice ve DealerPrice değerleri alır, ancak diğer ad ad aynı adı, fiyatı, bu iki sütunu için 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 anahtar olmayan sütunlarla ve null olabilirler

Aşağıdaki sorgu her iki alt anahtar olmayan sütunlarla aynı türe ait olan 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

Üretilen karşılık gelen xml budur.Yalnızca bir satır içi xsd kesir 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ı tür ListPrice ve DealerPrice olan money, ve her ikisi de boş tablo.Bu nedenle, bunlar sonuç xml içinde döndürülemez olduğundan yoktur sadece bir <Price> alt öðenin karmaþýk tür içinde bildirim , <row> olan minOccurs öğenin = 0 ve maxOccurs = 2.

  • Sonuç, çünkü DealerPrice değeri null ise tablo, yalnızca ListPrice olarak döndürülen bir <Price> öğesi.Eklerseniz XSINIL parametre öğeleri yönergesi için hem olan öğeler alırsınız xsi:nil için true olarak küme değer<Price> öğesine karşılık gelen DealerPrice.İkisi de alırsınız <Price> alt öğeleri de <row> satır içi xsd şeması ile karmaşık tür tanımında nillable öznitelik küme için doğru her ikisi için.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 anahtarı olmayan sütun

Aşağıdaki sorgu bir anahtar ve aynı türde bir anahtarı olmayan 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 

Aşağıdaki sorgu tablo karşı t Col1 ve where Col1 birincil anahtar ise ve null olamaz ve Col2 null olabilir Col2 için aynı diğer ad ad adı belirtir.Bu alt öğeleri 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ı sadece bir kısmını 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ı notta, <Col> Col2 için karşılık gelen öğe minOccurs sahip küme 0.

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ı diğer adlar verilir.Bu iki alt öğesi olan ve aynı ada sahip iki kardeş öğe oluşturur <raw> öğesi sonucu.Bu sütunların her ikisi de farklı tiplerde ve her ikisi de boş olabilir.Sonuç budur.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 hem Col3 olabileceğinden <Col> öğe bildirim minOccurs 0 ve 2 olarak maxOccurs olarak belirler.

  • Çünkü hem <Col> öğeleri, eşi, bir öðe bildirim şema.Ayrıca, öğelerinin her ikisi de farklı türlerde olduklarından, ancak her ikisi de olan basit türler şemasındaki öğe türü xsd:anySimpleType.Sonuçta, her örnek türü tarafından tanımlanan xsi:type öznitelik.

  • Sonuç, her örneğini <Col> öğesini kullanarak örnek türünü gösterir xsi:type öznitelik.