Aracılığıyla paylaş


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

FOR XML yan tümce, sorgunuz sorgu sonuçlar ile birlikte bir satır içi şema dönmek isteyebilirsiniz.Bir XDR şeması istiyorsanız, FOR XML yan tümcesini XMLDATA anahtar sözcüğünü kullanın.Bir XSD şeması istiyorsanız, XMLSCHEMA anahtar sözcüğünü kullanın.

Bu konu, XMLSCHEMA anahtar sözcüğünü açıklar ve elde edilen satır içi XSD şema yapısını açıklar.Satır içi şemalar isterken kısıtlamaları şunlardır:

  • XMLSCHEMA açık modda, yalnızca RAW ve Otomatik modda belirtebilirsiniz.

  • İç içe geçmiş bir FOR XML sorgusu belirtir türü yönergesi, sorgu sonucu iseXML türünü ve bu sonuç türlenmemiş XML. örnek olarak kabul Daha fazla bilgi için bkz:XML, SQL Server'da uygulama.

XMLSCHEMA FOR XML sorguda belirttiğiniz şemayı ve XML verilerini, sorgu sonucu alırsınız.Verilerin her üst düzey öğe, satır içi şema hedef ad alanına, başvuran bir varsayılan ad alaný bildirim 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="[AdventureWorks].[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 sonucu 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" .

Şema bölümü sonucu, birden çok ad tanımlayan birden çok şema belgesi içerebilir.En azından aşağıdaki iki şema belgeleri verilir:

  • Bir şema belgesi içinSqltypes ad ve hangi temel SQL türleri iade edilen.

  • XML için sorgu sonucu şeklini tanımlayan başka bir şema belgesi.

Ayrıca, varsa yazılıXML veri türleri sorgu sonucu bulunur, bu yazılı xml veri türleriyle ilgili şema eklenir.

Sabit bir bölümü ve otomatik olarak artırır sayısal bir bölümü için XML sonucu şeklini tanımlayan bir şema belgesi hedef ad alanını içerir.Biçimi, bu ad aşağıdaki görüntülenir; buradan olan bir pozitif tamsayı.Örneğin, önceki sorguda, urn: schemas - microsoft - com:sql:SqlRowSet1 hedef ad alanı olur.

urn:schemas-microsoft-com:sql:SqlRowSetn

Başka bir yürütme oluşan sonuç hedef ad değişikliği uygun olmayabilir.Oluşturulan XML sorgusu, örneğin, hedef ad alanında değişiklik Sorguyu güncelleştir gerektirir.XMLSCHEMA seçeneği için XML yan tümcesinde eklendiğinde, isteğe bağlı olarak hedef ad alanı belirtebilirsiniz.Oluşturulan XML sağladığınız ad içerir ve aynı bakılmaksızın kaç kez sorgu çalıştırdığınız kalır.

select ProductModelID, Name
from   Production.ProductModel
where ProductModelID=1
FOR XML AUTO, XMLSCHEMA ('MyURI')

Varlık öğeler

Ayrıntıları için sorgu sonucu oluşturulan XSD şema yapısının tartışmak için varlık öğenin ilk olarak açıklanan vardır

Varlık öğe için XML sorgu tarafından döndürülen XML verilerini bir sütun ve tablo oluşturan bir öğedir.Örneğin, aşağıdaki sorgu için XML ilgili bilgileri döndürürİlgili kişiAdventureWorks veritabanını. tablo

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

Bu sonucu oluşur:

  <Contact>
    <ContactID>1</ContactID>
    <FirstName>Syed</FirstName>
  </Contact>

Bu sonuç<Contact>olan varlık öğesi.XML sonucu birden çok varlık öğesi olabilir ve bunların her biri bir genel bildirim satır içi XSD şeması vardır.Örneğin, aşağıdaki sorgu, satış siparişi başlığı ve ayrıntılı bilgi için belirli bir sıraya 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, ortaya çıkan XML öğesi merkezli çünkü.Sorgu aynı zamanda XMLSCHEMA yönergesini belirtir.Bu nedenle, bir satır içi XSD şema döndürülür.Bu sonucu oluşur:

<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, genel şemada bildirilir.Başka bir deyişle, en üst düzeyde içinde bildirim görünür<Schema>öğe.

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

Öznitelik adı çatışmayı

Aşağıdaki tartışma esasCustOrder ve CustOrderDetail tablolar.Aşağıdaki örnekleri sınamak için bu tabloları oluşturma ve kendi örnek veri eklemek için:

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

FOR XML aynı bazen farklı özellikler, öznitelikler belirtmek için kullanılır.Örneğin, aşağıdaki öznitelik merkezli RAW modunda sorgu OrderID 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.Satır içi XSD şema öğesi iki kez tanımlanan SiparişNo unutmayın.Bildirimleri sahip minOccurs için OrderID CustOrderDetail tablosundan karşılık gelen 0 olarak ayarlayın ve sipariş kimliği birincil anahtar sütun için ikinci eşlerCustOrder minOccurs olduğu varsayılan. 1 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ı çatışmayı

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

durum 1: Her iki alt öğeler aynı türden olmayan sütunlar ve olabilir null

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

Oluşturulan XML karşılık gelen budur.Satır içi XSD yalnızca bir bölümü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ındaki aşağıdakilere dikkat edin:

  • Her ikisi de aynı tür ListPrice ve DealerPrice olanparaher ikisi de null olabilir; tablo.Bu nedenle, çünkü bunlar döndürülmez sonuç XML'de yoktur sadece bir<Price>alt öğe karmaþýk tür bildiriminde<row>olan minOccurs öğenin = 0 ve maxOccurs = 2.

  • Sonuç içinDealerPrice değer, boş olan tablo, yalnızca ListPrice bir <Price> öğesi. döndürülüyor EklersenizXSINIL parametre öğeleri yönerge için her iki xsi: nil değerine sahip öğeler alacak küme karşılık gelen DealerPrice.<Price> için öğesi için true Siz de alacak iki<Price>alt öğeleri<row>satır içi XSD şeması ile karmaşık tür tanımındaNillable özniteliği küme her ikisi için de True.Bu parça, kısmi bir sonuç şudur:

…
<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 olmayan sütun aynı yazın

Aşağıdaki sorgu bir anahtar ve aynı türde olmayan sütun gösterir.

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

Aşağıdaki sorguyu tablo karşıT Sütun1 ve col1, burada Sütun1 birincil anahtar, null olamaz ve col1 olabilir boş. aynı diğer ad ad adı belirtir Bu alt öğeleri olan iki kardeş öğe oluşturur<row>öğe.

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

Sonuç budur.Satır içi XSD şema yalnızca bir bölümü görüntü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" />
  <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 şema notta,<Col>için col1 karşılık gelen öğe sahip minOccurs değeri 0 olarak ayarlayın.

durum 3: Her iki farklı türleri ve karşılık gelen sütun öğelerinin olabilir NULL

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

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

Aşağıdaki sorgu col1 ve Col3 aynı adlar verilir.Bu, aynı ada sahip olan ve her iki alt öğeleri olan iki kardeş öğe oluşturur<raw>öğe sonucu.Bu sütunların her iki farklı türde ve her ikisi de null olabilir.Sonuç budur.Yalnızca kısmi satır içi XSD şema 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ındaki aşağıdakilere dikkat edin:

  • NULL, olabileceğinden col1 hem de Col3<Col>öðe bildirim, 0 ve 2 olarak maxOccurs the minOccurs belirtir.

  • Çünkü her ikisi de<Col>eşi olan öğeleri, şema. bir öğe bildirimAyrıca, öğelerinin her ikisi de farklı olduğundan, ancak her ikisi de olan basit türleri, şema öğesinde türxsd:anySimpleType.Her örnek türü tanımlanır sonucu,xsi: type öznitelik.

  • Sonuç her örneğini<Col>öğesini kullanarak kopya türünü gösterirxsi: type özniteliği.