Generowanie schematu wbudowany XSD
W klauzula dla XML może żądać, że kwerendy zwracają schemat wbudowany wraz z kwerendą wyniki.Jeśli chcesz schematu XDR słowo kluczowe XMLDATA są użyte w klauzula XML dla.Schematu XSD, należy użyć słowa kluczowego schematu XML.
W tym temacie opisano kluczowe schematu XML i wyjaśniono Struktura wynikowa wbudowanego schematu XSD.Gdy żądają schematy wbudowane, ograniczenia są następujące:
Schematu XML można określić tylko w trybie surowców i AUTO, a nie w trybie JAWNE.
Jeśli kwerenda zagnieżdżona XML dla określa dyrektywa typu, wynik kwerendy jest xml typu, a wynik jest traktowany jako wystąpienie bez typu danych XML.Aby uzyskać więcej informacji, zobacz Implementowanie XML w programie SQL Server.
Po określeniu schematu XML w kwerendzie XML do odbierania schemat oraz dane XML, wynik kwerendy.Każdy element najwyższego poziom danych odnosi się do poprzedniego schematu przy użyciu domyślnego deklaracja obszaru nazw, który z kolei odwołuje się do miejsce docelowe nazw wbudowanego schematu.
Na przykład:
<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" />
Wynik zawiera schemat XML i wyników XML. <ProductModel> Element najwyższego poziom w wyniku odnosi się do schematu przy użyciu domyślnego deklaracja obszaru nazw, xmlns = "urn: schemas-microsoft-com:sql:SqlRowSet1" .
Część schematu wyników może zawierać wiele dokumentów schematu, które opisują wiele obszarów nazw.Zwracane są następujące dokumenty schematu dwóch co najmniej:
Dokument jednego schematu dla Właściwości Sqltypes obszaru nazw, i dla których zwracanych typów podstawowych SQL.
Inny dokument schemat opisujący kształt XML dla wyniku kwerendy.
Ponadto jeśli wpisany xml typy danych są uwzględnione w wyniku kwerendy schematów skojarzonych z tymi wpisane xml typy danych są uwzględniane.
miejsce docelowe obszar nazw dokument schematu, opisujący kształt wyników XML dla zawiera część stałą i części numerycznej, która automatycznie zwiększa.Format tego obszaru nazw jest pokazany poniżej której n jest dodatnią liczbą całkowitą.Na przykład w poprzedniej kwerendy urn: schemas-microsoft-com:sql:SqlRowSet1 jest miejsce docelowe obszar nazw.
urn:schemas-microsoft-com:sql:SqlRowSetn
Zmiana nazw miejsce docelowe w wyniku wystąpienia z wykonanie jednego do drugiego może nie być pożądane.Na przykład, jeśli kwerenda wynikowy XML, zmiany w miejsce docelowe nazw będą wymagały aktualizacji kwerendy.Opcjonalnie można określić miejsce docelowe nazw podczas dodawania w klauzula XML dla opcji schematu XML.XML wynikowy będzie zawierać nazw podane i pozostaną takie same, niezależnie od tego, ile razy uruchom kwerendę.
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=1
FOR XML AUTO, XMLSCHEMA ('MyURI')
Elementy encji
Aby przedyskutować Szczegóły konstrukcji schematu XSD generowane dla wyników kwerendy, element obiekt ma najpierw opisywane
Element obiekt danych XML zwróconych przez kwerendę dla XML jest element, który jest generowany z tabela, a nie z kolumna.Na przykład, poniższa kwerenda XML dla zwraca informacje o kontakcie z Person tabela w AdventureWorks2008R2 bazy danych.
SELECT BusinessEntityID, FirstName
FROM Person.Person
WHERE BusinessEntityID = 1
FOR XML AUTO, ELEMENTS
Jest to wynikiem:
<Person>
<BusinessEntityID>1</BusinessEntityID>
<FirstName>Ken</FirstName>
</Person>
W wyniku tego <Person> jest elementem obiekt.W wyniku XML może być wiele elementów obiekt i każdy z tych ma globalnego deklaracja w wbudowanego schematu XSD.Na przykład poniższa kwerenda pobiera informacje nagłówka i szczegóły zamówienia sprzedaży dla określonego zamówienia.
SELECT SalesOrderHeader.SalesOrderID, ProductID, OrderQty
FROM Sales.SalesOrderHeader, Sales.SalesOrderDetail
WHERE SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
AND SalesOrderHeader.SalesOrderID=5001
FOR XML AUTO, ELEMENTS, XMLSCHEMA
Ponieważ kwerendy określa dyrektywa elementów XML wynikowy jest zorientowany na element.Kwerendy określa również dyrektywy schematu XML.Dlatego wbudowanego schematu XSD jest zwracany.Jest to wynikiem:
<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>
Poniższe z poprzedniej kwerendy:
W wyniku <SalesOrderHeader> i <SalesOrderDetail> są obiekt elementów.Z tego względu są one globalnie zgłoszone w schemacie.Oznacza to, że deklaracja pojawia się u góry poziom wewnątrz <Schema> elementu.
<SalesOrderID>, <ProductID>, I <OrderQty> są nie elementów obiekt, ponieważ ich mapować kolumn.Dane kolumna są zwracane jako elementy XML, z powodu elementów niniejszej dyrektywy.Te są mapowane na elementy lokalne elementu obiekt typu złożonego.Należy zauważyć, że jeżeli dyrektywa elementów nie jest określony, SalesOrderID, ProductID i OrderQty wartości są mapowane do atrybutów lokalnych odpowiadającego im elementu obiekt złożonego typu.
Atrybut nazwy kolizji
Następujące dyskusji jest oparta na CustOrder i CustOrderDetail tabele.Aby przetestować następujące próbki, Utwórz te tabele i Dodaj dane przykładowe:
CREATE TABLE CustOrder (OrderID int primary key, CustomerID int)
GO
CREATE TABLE CustOrderDetail (OrderID int, ProductID int, Qty int)
GO
XML dla tej samej nazwy czasami umożliwia wskazują różne właściwości i atrybuty.Na przykład poniższa kwerenda zorientowany atrybut trybie NIEPRZETWORZONYM generuje dwa atrybuty, które mają taką samą nazwę, IDZamówienia.Generuje błąd.
SELECT CustOrder.OrderID,
CustOrderDetail.ProductID,
CustOrderDetail.OrderID
FROM dbo.CustOrder, dbo.CustOrderDetail
WHERE CustOrder.OrderID = CustOrderDetail.OrderID
FOR XML RAW, XMLSCHEMA
Jednak ponieważ dopuszczalne mają dwa elementy, które mają taką samą nazwę, można wyeliminować problem przez dodanie elementów niniejszej dyrektywy:
SELECT CustOrder.OrderID,
CustOrderDetail.ProductID,
CustOrderDetail.OrderID
from dbo.CustOrder, dbo.CustOrderDetail
where CustOrder.OrderID = CustOrderDetail.OrderID
FOR XML RAW, XMLSCHEMA, ELEMENTS
Jest to wynikiem.Uwaga w wbudowanej schematu XSD, IDZamówienia elementu zdefiniowano dwa razy.Deklaracje został minOccurs zestaw 0, odpowiadającą IDZamówienia z tabela CustOrderDetail i drugi mapuje IDZamówienia kolumna klucz podstawowego z CustOrder tabela, gdzie parametr minOccurs ma wartość 1, domyślnie
<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>
Element kolizji nazw
XML dla tej samej nazwie może służyć do wskazania dwa podelementy.Na przykład poniższa kwerenda pobiera wartości ListPrice i DealerPrice produktów, ale kwerendy określa takiego samego alias, ceny dla tych dwóch kolumn.Wynikowy zestaw wierszy będą więc dwie kolumny o tej samej nazwie.
Przypadek 1: Zarówno podelementy są kolumnami tego samego typu i może mieć wartość NULL
W następującej kwerendzie zarówno podelementy są kolumnami tego samego typu i może mieć wartość NULL.
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
Jest to odpowiednie XML generowane.Pokazano jedynie ułamek wbudowany XSD:
…
<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>
Poniższe w wbudowanego schematu XSD:
ListPrice i DealerPrice są tego samego typu, money, i może być NULL w tabela.Dlatego, ponieważ mogą one nie będą zwracane w wynikowym pliku XML, jest tylko jeden <Price> element podrzędność w deklaracja typu złożonego z <row> elementu, który ma minOccurs = 0 i maxOccurs = 2.
W wyniku ponieważ DealerPrice jest wartość NULL w tabela tylko ListPrice są zwracane jako <Price> elementu.Jeśli dodasz XSINIL parametr dyrektywy elementów, wyświetlony zostanie zarówno elementy, które mają xsi:nil wartość zestaw na wartość TRUE dla<Price> element, który odpowiada DealerPrice.Otrzymasz również dwa <Price> elementów podrzędność w <row> definicji typu złożonego w schemacie wbudowany XSD z nillable atrybut zestaw na wartość TRUE dla obu.Ten fragment jest wynik częściowy:
…
<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>
Przypadek 2: Jeden klucz i jedną kolumna nonkey tego samego typu
Poniższa kwerenda przedstawia jeden klucz i jedną kolumna nonkey tego samego typu.
CREATE TABLE T (Col1 int primary key, Col2 int, Col3 nvarchar(20))
go
INSERT INTO T VALUES (1, 1, 'test')
go
Następująca kwerenda tabela t określa samego alias Kol1 i Kol2, gdzie Kol1 jest klucz podstawowy i nie może być null, i Kol2 może być zerowa.Generuje dwa elementy równorzędne dzieci <row> elementu.
SELECT Col1 as Col, Col2 as Col, Col3
FROM T
FOR XML RAW, ELEMENTS, XMLSCHEMA
Jest to wynikiem.Jest wyświetlany tylko fragment wbudowanego schematu XSD.
…
<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>
Uwaga w wbudowanego schematu XSD, <Col> minOccurs ma element odpowiadający Kol2 zestaw 0.
Przypadek 3: Zarówno elementy różnych typów i odpowiadających im kolumn może mieć wartości NULL.
Określono następujące kwerendy przeciwko próbki tabela przypadek 2:
SELECT Col1, Col2 as Col, Col3 as Col
FROM T
FOR XML RAW, ELEMENTS, XMLSCHEMA
W następującej kwerendzie Kol2 i Col3 podane są tym samym aliasów.Generuje dwa elementy równorzędne mają tę samą nazwę i są zarówno dzieci <raw> elementu w wyniku.Obie te kolumny są różnych typów i może być NULL.Jest to wynikiem.Jest wyświetlany tylko częściowe wbudowanego schematu XSD.
…
<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>
Poniższe w wbudowanego schematu XSD:
Ponieważ Kol2 i Col3 może być NULL, <Col> deklaracja elementu minOccurs Określa, jak 0 i maxOccurs jako 2.
Ponieważ zarówno <Col> elementy są równorzędne, istnieje jedna deklaracja element w schemacie.Ponieważ oba elementy są również różnych rodzajów, chociaż oba są także prostymi typami typ elementu w schemacie jest xsd:anySimpleType.W wyniku każdego typu wystąpienie jest identyfikowane przez xsi:type atrybut.
W wyniku każde wystąpienie <Col> element odnosi się do jego typu wystąpienia przy użyciu xsi:type atrybut.