Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
azure SQL Database
Toto téma vysvětluje, jak se mapovací schéma (XSD nebo XDR), které je specifikováno v updategramu, používá ke zpracování aktualizací. V updategramu můžete zadat název anotovaného mapovacího schématu, které použijete při mapování prvků a atributů v updategramu do tabulek a sloupců v Microsoft SQL Serveru. Když je mapovací schéma specifikováno v updategramu, musí se jména prvků a atributů specifikovaná v updategramu mapovat na prvky a atributy v mapovacím schématu.
Pro specifikaci mapovacího schématu použijete atribut mapping-schemasynchronizačního prvku<>. Následující příklady ukazují dva updategramy: jeden používá jednoduché mapovací schéma a druhý složitější schéma.
Poznámka:
Tato dokumentace předpokládá, že znáte šablony a podporu mapovacích schémat v SQL Serveru. Pro více informací viz Úvod do anotovaných XSD schémat (SQLXML 4.0). Pro starší aplikace, které používají XDR, viz Annotated XDR Schemas (zastaralé v SQLXML 4.0).
Práce s datovými typy
Pokud schéma specifikuje obraz, binární nebo varbinárnítyp dat SQL Server (pomocí sql:datatype) a nespecifikuje XML datový typ, aktualizační gram předpokládá, že XML datový typ je binární v základu 64. Pokud jsou vaše data typu bin.base, musíte explicitně specifikovat typ (dt:type=bin.base nebo type="xsd:hexBinary").
Pokud schéma specifikuje datový typ dateTime, date nebo time XSD, musíte také zadat odpovídající datový typ SQL Server pomocí sql:datatype="dateTime".
Při zpracování parametrů typu money SQL Server musíte explicitně zadat sql:datatype="money" na příslušném uzlu v mapovacím schématu.
Examples
Pokud chcete vytvořit pracovní ukázky pomocí následujících příkladů, musíte splňovat požadavky uvedené v části Požadavky pro spouštění příkladů SQLXML.
A. Vytvoření updategramu s jednoduchým mapovacím schématem
Následující schéma XSD (SampleSchema.xml) je mapovací schéma, které mapuje prvek <Customer> na tabulku Sales.Customer:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Customer" sql:relation="Sales.Customer" >
<xsd:complexType>
<xsd:attribute name="CustID"
sql:field="CustomerID"
type="xsd:string" />
<xsd:attribute name="RegionID"
sql:field="TerritoryID"
type="xsd:string" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Následující aktualizační gram vkládá záznam do tabulky Sales.Customer a spoléhá na předchozí mapovací schéma, aby správně mapoval tato data na tabulku. Všimněte si, že updategram používá stejný název prvku, <Customer>, jak je definováno ve schématu. To je povinné, protože updategram specifikuje konkrétní schéma.
Pro testování updategramu
Zkopírujte výše uvedený kód schématu a vložte ho do textového souboru. Uložte soubor jako SampleUpdateSchema.xml.
Zkopírujte šablonu updategramu níže a vložte ji do textového souboru. Ulož soubor jako SampleUpdategram.xml do stejného adresáře, kde jsi uložil SampleUpdateSchema.xml.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <updg:sync mapping-schema="SampleUpdateSchema.xml"> <updg:before> <Customer CustID="1" RegionID="1" /> </updg:before> <updg:after> <Customer CustID="1" RegionID="2" /> </updg:after> </updg:sync> </ROOT>Adresářová cesta určená pro mapovací schéma (SampleUpdateSchema.xml) je relativní k adresáři, ve kterém je šablona uložena. Absolutní cestu lze také specifikovat, například:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"Vytvořte a použijte testovací skript SQLXML 4.0 (Sqlxml4test.vbs) k provedení šablony.
Další informace naleznete v tématu Použití ADO ke spouštění dotazů SQLXML 4.0.
Toto je ekvivalentní schéma XDR:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="Customer" sql:relation="Sales.Customer" >
<AttributeType name="CustID" />
<AttributeType name="RegionID" />
<attribute type="CustID" sql:field="CustomerID" />
<attribute type="RegionID" sql:field="TerritoryID" />
</ElementType>
</Schema>
B. Vkládání záznamu pomocí vztahu rodič-dítě specifikovaného v mapovacím schématu
Prvky schématu lze vzájemně vztahovat. Prvek <sql:relation> specifikuje vztah rodič-potomek mezi prvky schématu. Tyto informace se používají k aktualizaci odpovídajících tabulek, které mají vztah primárního klíče/cizího klíče.
Následující mapovací schéma (SampleSchema.xml) se skládá ze dvou prvků, <Řádu> a <OD>:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="OrderOD"
parent="Sales.SalesOrderHeader"
parent-key="SalesOrderID"
child="Sales.SalesOrderDetail"
child-key="SalesOrderID" />
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="OD"
sql:relation="Sales.SalesOrderDetail"
sql:relationship="OrderOD" >
<xsd:complexType>
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="ProductID" type="xsd:integer" />
<xsd:attribute name="UnitPrice" type="xsd:decimal" />
<xsd:attribute name="OrderQty" type="xsd:integer" />
<xsd:attribute name="UnitPriceDiscount" type="xsd:decimal" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="CustomerID" type="xsd:string" />
<xsd:attribute name="SalesOrderID" type="xsd:integer" />
<xsd:attribute name="OrderDate" type="xsd:date" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
Následující aktualizační gram používá toto schéma XSD k přidání nového záznamu o detailu objednávky (prvek <OD> v následném> bloku<) pro objednávku 43860. Atribut mapping-schema se používá k určení mapovacího schématu v updategramu.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before>
<Order SalesOrderID="43860" />
</updg:before>
<updg:after>
<Order SalesOrderID="43860" >
<OD ProductID="753" UnitPrice="$10.00"
Quantity="5" Discount="0.0" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
Pro testování updategramu
Zkopírujte výše uvedený kód schématu a vložte ho do textového souboru. Uložte soubor jako SampleUpdateSchema.xml.
Zkopírujte výše uvedenou šablonu updategramu a vložte ji do textového souboru. Ulož soubor jako SampleUpdategram.xml do stejného adresáře, kde jsi uložil SampleUpdateSchema.xml.
Adresářová cesta určená pro mapovací schéma (SampleUpdateSchema.xml) je relativní k adresáři, ve kterém je šablona uložena. Absolutní cestu lze také specifikovat, například:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"Vytvořte a použijte testovací skript SQLXML 4.0 (Sqlxml4test.vbs) k provedení šablony.
Další informace naleznete v tématu Použití ADO ke spouštění dotazů SQLXML 4.0.
Toto je ekvivalentní schéma XDR:
<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="OD" sql:relation="Sales.SalesOrderDetail" >
<AttributeType name="SalesOrderID" />
<AttributeType name="ProductID" />
<AttributeType name="UnitPrice" dt:type="fixed.14.4" />
<AttributeType name="OrderQty" />
<AttributeType name="UnitPriceDiscount" />
<attribute type="SalesOrderID" />
<attribute type="ProductID" />
<attribute type="UnitPrice" />
<attribute type="OrderQty" />
<attribute type="UnitPriceDiscount" />
</ElementType>
<ElementType name="Order" sql:relation="Sales.SalesOrderHeader" >
<AttributeType name="CustomerID" />
<AttributeType name="SalesOrderID" />
<AttributeType name="OrderDate" />
<attribute type="CustomerID" />
<attribute type="SalesOrderID" />
<attribute type="OrderDate" />
<element type="OD" >
<sql:relationship
key-relation="Sales.SalesOrderHeader"
key="SalesOrderID"
foreign-key="SalesOrderID"
foreign-relation="Sales.SalesOrderDetail" />
</element>
</ElementType>
</Schema>
C. Vložení záznamu pomocí vztahu rodič-dítě a inverzní anotace specifikované v XSD schématu
Tento příklad ilustruje, jak logika updategramu využívá vztah rodič-dítě specifikovaný v XSD k zpracování aktualizací a jak se používá inverzní anotace. Pro více informací o inverzní anotaci viz Specifikace atributu sql:inverse na sql:relation (SQLXML 4.0).
Tento příklad předpokládá, že následující tabulky jsou v databázi tempdb :
Cust (CustomerID, CompanyName), kdeCustomerIDje primární klíčOrd (OrderID, CustomerID), kdeCustomerIDje cizí klíč, který odkazuje na primárníCustomerIDklíč v tabulceCust.
Updategram používá následující schéma XSD pro vkládání záznamů do tabulek Cust a Ord:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:annotation>
<xsd:appinfo>
<sql:relationship name="OrdCust" inverse="true"
parent="Ord"
parent-key="CustomerID"
child-key="CustomerID"
child="Cust"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:element name="Order" sql:relation="Ord">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Customer" sql:relationship="OrdCust"/>
</xsd:sequence>
<xsd:attribute name="OrderID" type="xsd:int"/>
<xsd:attribute name="CustomerID" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="Customer" sql:relation="Cust">
<xsd:complexType>
<xsd:attribute name="CustomerID" type="xsd:string"/>
<xsd:attribute name="CompanyName" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
XSD schéma v tomto příkladu obsahuje <prvky Zákazník> a <Objednávka> a specifikuje vztah rodič-dítě mezi těmito dvěma prvky. Identifikuje <Objednávku> jako nadřazenský prvek a <zákazníka> jako podřízený prvek.
Logika zpracování updategramů využívá informace o vztahu rodič-dítě k určení pořadí, v jakém jsou záznamy vkládány do tabulek. V tomto příkladu se logika updategramu nejprve pokusí vložit záznam do tabulky Ord (protože <Order> je rodič) a poté se pokusí vložit záznam do tabulky Cust (protože <Customer> je potomkem). Nicméně kvůli informacím o primárním klíči/cizím klíči, které jsou obsaženy ve schématu tabulky databáze, tato operace vkládání způsobuje porušení cizího klíče v databázi a vložení selže.
Pro instruaci logiky updategramu, aby během aktualizace obrátila vztah rodič-potomek, je na prvku <vztahu> specifikována inverzní anotace. Výsledkem je, že záznamy jsou nejprve přidány do tabulky Cust a poté do tabulky Ord, a operace je úspěšná.
Následující updategram vkládá objednávku (OrderID=2) do tabulky Ord a zákazníka (CustomerID='AAAAA') do tabulky Cust pomocí specifikovaného schématu XSD:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleUpdateSchema.xml" >
<updg:before/>
<updg:after>
<Order OrderID="2" CustomerID="AAAAA" >
<Customer CustomerID="AAAAA" CompanyName="AAAAA Company" />
</Order>
</updg:after>
</updg:sync>
</ROOT>
Pro testování updategramu
Vytvořte tyto tabulky v databázi tempdb :
USE tempdb CREATE TABLE Cust(CustomerID varchar(5) primary key, CompanyName varchar(20)) GO CREATE TABLE Ord (OrderID int primary key, CustomerID varchar(5) references Cust(CustomerID)) GOZkopírujte výše uvedený kód schématu a vložte ho do textového souboru. Uložte soubor jako SampleUpdateSchema.xml.
Zkopírujte výše uvedenou šablonu updategramu a vložte ji do textového souboru. Ulož soubor jako SampleUpdategram.xml do stejného adresáře, kde jsi uložil SampleUpdateSchema.xml.
Adresářová cesta určená pro mapovací schéma (SampleUpdateSchema.xml) je relativní k adresáři, ve kterém je šablona uložena. Absolutní cestu lze také specifikovat, například:
mapping-schema="C:\SqlXmlTest\SampleUpdateSchema.xml"Vytvořte a použijte testovací skript SQLXML 4.0 (Sqlxml4test.vbs) k provedení šablony.
Další informace naleznete v tématu Použití ADO ke spouštění dotazů SQLXML 4.0.