Einfügen von Daten mit XML-Updategrams (SQLXML 4.0)
Ein Updategram zeigt einen Einfügevorgang an, wenn eine Datensatzinstanz im <after>-Block, jedoch nicht im entsprechenden <before>-Block erscheint. In diesem Fall fügt das Updategram den Datensatz in den <after>-Block in der Datenbank ein.
Dies ist das Updategramformat für einen Einfügevorgang:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync [mapping-schema="SampleSchema.xml"] >
[<updg:before>
</updg:before>]
<updg:after [updg:returnid="x y ...] >
<ElementName [updg:id="value"]
[updg:at-identity="x"]
[updg:guid="y"]
attribute="value"
attribute="value"
...
/>
[<ElementName .../>... ]
</updg:after>
</updg:sync>
</ROOT>
<before>-Block
Der <before>-Block kann für einen Einfügevorgang weggelassen werden. Wenn das optionale mapping-schema-Attribut nicht angegeben wird, wird der im Updategram angegebene <ElementName> einer Datenbanktabelle zugeordnet, und die untergeordneten Elemente oder Attribute werden den Spalten der Tabelle zugeordnet.
<after>-Block
Sie können einen oder mehrere Datensätze im <after>-Block angeben.
Wenn der <after>-Block für eine bestimmte Spalte keinen Wert liefert, verwendet das Updategram den in dem mit Anmerkungen versehenen Schema angegebenen Standardwert (falls ein Schema angegeben wurde). Wenn im Schema kein Standardwert für die Spalte angegeben ist, gibt das Schema keinen expliziten Wert für diese Spalte an. Stattdessen wird dieser Spalte der Standardwert von Microsoft SQL Server zugewiesen (falls angegeben). Wenn kein SQL Server-Standardwert vorhanden ist, und die Spalte einen NULL-Wert akzeptiert, legt das Updategram den Spaltenwert auf NULL fest. Wenn die Spalte weder einen Standardwert besitzt, noch einen NULL-Wert akzeptiert, schlägt der Befehl fehl, und das Updategram gibt einen Fehler zurück. Das optionale updg:returnid-Attribut wird verwendet, um den Identitätswert zurückzugeben, der vom System generiert wird, wenn ein Datensatz einer Tabelle mit einer Spalte vom Typ IDENTITY hinzugefügt wird.
updg:id-Attribut
Wenn das Updategram nur Datensätze einfügt, erfordert das Updategram das updg:id-Attribut nicht. Weitere Informationen zu updg:id finden Sie unter Aktualisieren von Daten mit XML-Updategrams (SQLXML 4.0).
updg:at-identity-Attribut
Wenn ein Updategram einen Datensatz in eine Tabelle mit einer Spalte vom Typ IDENTITY einfügt, kann das Updategram mithilfe des optionalen updg:at-identity-Attributs den vom System zugewiesenen Wert erfassen. Das Updategram kann dann diesen Wert in nachfolgenden Vorgängen verwenden. Beim Ausführen des Updategrams können Sie den generierten Identitätswert zurückgeben lassen, indem Sie das updg:returnid-Attribut angeben.
updg:guid-Attribut
Das updg:guid-Attribut ist ein optionales Attribut, das einen global eindeutigen Bezeichner (Globally Unique Identifier, GUID) generiert. Dieser Wert gilt für den ganzen <sync> -Block, in dem er angegeben ist. Sie können diesen Wert überall im <sync>-Block verwenden. Das Attribut ruft die NEWGUID()-SQL Server-Funktion auf, um den eindeutigen Bezeichner zu generieren.
Beispiele
Damit mithilfe der folgenden Beispiele funktionierende Beispiele erstellt werden können, müssen die in Anforderungen zum Ausführen von SQLXML-Beispielen angegebenen Anforderungen erfüllt sein.
Bevor Sie die Updategrambeispiele verwenden, beachten Sie Folgendes:
Die meisten der Beispiele verwenden die Standardzuordnung (d. h. es ist kein Zuordnungsschema im Updategram angegeben). Weitere Beispiele für Updategrams, die Zuordnungsschemas verwenden, finden Sie unter Angeben eines Zuordnungsschemas mit Anmerkungen in einem Updategram (SQLXML 4.0).
Die meisten der Beispiele verwenden die AdventureWorks-Beispieldatenbank. Alle Aktualisierungen werden für die Tabellen in dieser Datenbank übernommen. Sie können die AdventureWorks-Datenbank wiederherstellen. Informationen zum Wiederherstellen der AdventureWorks-Datenbank finden Sie unter AdventureWorks-Beispieldatenbanken.
A. Einfügen eines Datensatzes mithilfe eines Updategrams
Dieses attributzentrierte Updategram fügt einen Datensatz in die HumanResources.Employee-Tabelle in der AdventureWorks-Datenbank ein.
In diesem Beispiel gibt das Updategram kein Zuordnungsschema an. Daher verwendet das Updategram die Standardzuordnung, in der der Elementname einem Tabellennamen, und die untergeordneten Elemente oder Attribute den Spalten in dieser Tabelle zugeordnet werden.
Das AdventureWorks-Schema für die HumanResources.Employee-Tabelle erzwingt eine 'Nicht-NULL'-Einschränkung für alle Spalten außer ManagerID und EmployeeID. Daher muss das Updategram für alle Spalten außer diesen beiden Spalten Werte angeben. ManagerID wird weggelassen, damit der Wert nach der Ausführung des Updategrams NULL ist. EmployeeID ist eine Spalte vom Typ IDENTITY. Daher werden keine Werte dafür angegeben.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<HumanResources.Employee
NationalIDNumber="111111111"
ContactID="1156"
LoginID="adventure-works\paulw0"
DepartmentID="7"
ShiftID="3"
Title="Production Technician - WC40"
EmergencyContactID="1445"
AddressID="157"
BirthDate="1970-12-15 00:00:00.000"
MaritalStatus="S"
Gender="M"
HireDate="1999-01-05 00:00:00.000"
SalariedFlag="0"
BaseRate="15.00"
PayFrequency="1"
VacationHours="80"
SickLeaveHours="80"
CurrentFlag="1"
rowguid="00001111-2222-3333-4444-555566667777"
ModifiedDate="1998-12-29 00:00:00.000"/>
</updg:after>
</updg:sync>
</ROOT>
So testen Sie eine XPath-Beispielabfrage mit dem Schema
Kopieren Sie das oben stehende Updategram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen MyUpdategram.xml.
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um die Vorlage auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.
In einer elementzentrierten Zuordnung sieht das Updategram aus wie folgt:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<HumanResources.Employee>
<NationalIDNumber>111111111</NationalIDNumber>
<ContactID>1156</ContactID>
<LoginID>adventure-works\paulw0</LoginID>
<DepartmentID>7</DepartmentID>
<ShiftID>3</ShiftID>
<Title>Production Technician - WC40</Title>
<EmergencyContactID>1445</EmergencyContactID>
<AddressID>157</AddressID>
<BirthDate>1970-12-15 00:00:00.000</BirthDate>
<MaritalStatus>S</MaritalStatus>
<Gender>M</Gender>
<HireDate>1999-01-05 00:00:00.000</HireDate>
<SalariedFlag>0</SalariedFlag>
<BaseRate>15.00</BaseRate>
<PayFrequency>1</PayFrequency>
<VacationHours>80</VacationHours>
<SickLeaveHours>80</SickLeaveHours>
<CurrentFlag>1</CurrentFlag>
<rowguid>00001111-2222-3333-4444-555566667777</rowguid>
<ModifiedDate>1998-12-29 00:00:00.000</ModifiedDate>
</HumanResources.Employee>
</updg:after>
</updg:sync>
</ROOT>
Im gemischten Modus (elementzentriert und attributzentriert) kann ein Element sowohl Attribute als auch Unterelemente aufweisen, wie in diesem Updategram gezeigt:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<HumanResources.Employee
NationalIDNumber="111111111"
ContactID="1156"
DepartmentID="7"
ShiftID="3"
EmergencyContactID="1445"
AddressID="157"
SalariedFlag="0"
BaseRate="15.00"
PayFrequency="1"
VacationHours="80"
SickLeaveHours="80"
CurrentFlag="1">
<LoginID>adventure-works\paulw0</LoginID>
<Title>Production Technician - WC40</Title>
<BirthDate>1970-12-15 00:00:00.000</BirthDate>
<HireDate>1999-01-05 00:00:00.000</HireDate>
<MaritalStatus>S</MaritalStatus>
<Gender>M</Gender>
<rowguid>00001111-2222-3333-4444-555566667777</rowguid>
<ModifiedDate>1998-12-29 00:00:00.000</ModifiedDate>
</HumanResources.Employee>
</updg:after>
</updg:sync>
</ROOT>
B. Einfügen mehrerer Datensätze mithilfe eines Updategrams
Dieses Updategram fügt der HumanResources.Shift-Tabelle zwei neue Schichtdatensätze hinzu. Der optionale <before>-Block wird nicht im Updategram angegeben.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync>
<updg:after >
<HumanResources.Shift Name="Day-Evening"
StartTime="1900-01-01 11:00:00.000"
EndTime="1900-01-01 19:00:00.000"
ModifiedDate="2004-01-01 00:00:00.000" />
<HumanResources.Shift Name="Evening-Night"
StartTime="1900-01-01 19:00:00.000"
EndTime="1900-01-01 03:00:00.000"
ModifiedDate="2004-01-01 00:00:00.000" />
</updg:after>
</updg:sync>
</ROOT>
So testen Sie eine XPath-Beispielabfrage mit dem Schema
Kopieren Sie das oben stehende Updategram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen Updategram-AddShifts.xml.
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um die Vorlage auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.
Eine andere Version dieses Beispiels ist ein Updategram mit zwei separaten <after>-Blöcken statt einem Block, um die beiden Mitarbeiter hinzuzufügen. Dies ist gültig und kann wie folgt codiert werden:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync>
<updg:after >
<HumanResources.Shift Name="Day-Evening"
StartTime="1900-01-01 11:00:00.000"
EndTime="1900-01-01 19:00:00.000"
ModifiedDate="2004-01-01 00:00:00.000" />
</updg:after>
<updg:before>
</updg:before>
<updg:after >
<HumanResources.Shift Name="Evening-Night"
StartTime="1900-01-01 19:00:00.000"
EndTime="1900-01-01 03:00:00.000"
ModifiedDate="2004-01-01 00:00:00.000" />
</updg:after>
</updg:sync>
</ROOT>
C. Arbeiten mit gültigen SQL Server-Zeichen, die in XML nicht gültig sind
In SQL Server können Tabellennamen Leerzeichen enthalten, wie beispielsweise die Order Details-Tabelle in der Northwind-Datenbank. Dies ist jedoch in XML-Zeichen nicht gültig, die gültige SQL Server-Bezeichner sind. Ungültige XML-Bezeichner können mit '__xHHHH__' als Codierungswert codiert werden, wobei 'HHHH' für den vierstelligen hexadezimalen UCS-2-Code des signifikantesten Zeichens in einer nach Signifikanz geordneten Bitfolge steht.
Hinweis |
---|
In diesem Beispiel wird die Northwind-Datenbank verwendet, die zuerst mit SQL Server 2000 als Beispieldatenbank bereitgestellt wurde. Die Northwind-Datenbank wird nicht mit höheren Versionen von SQL Server bereitgestellt. Sie können die Northwind-Datenbank jedoch mit einem zum Download verfügbaren SQL-Skript installieren. Weitere Informationen finden Sie unter Herunterladen der Beispieldatenbanken Northwind und pubs. |
Der Elementname muss in Klammern ([ ]) stehen. Da die Zeichen "[" und "]" in XML nicht gültig sind, müssen Sie sie als "_x005B_" und "_x005D_" codieren. (Falls Sie ein Zuordnungsschema verwenden, können Sie Elementnamen bereitstellen, die keine ungültigen Zeichen wie Leezeichen enthalten. Die erforderliche Zuordnung erfolgt über das Zuordnungsschema, daher müssen Sie diese Zeichen nicht codieren.)
Dieses Updategram fügt der Order Details-Tabelle der Northwind-Datenbank einen Datensatz hinzu:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<_x005B_Order_x0020_Details_x005D_ OrderID="1"
ProductID="11"
UnitPrice="$1.0"
Quantity="1"
Discount="0.0" />
</updg:after>
</updg:sync>
</ROOT>
Die UnitPrice-Spalte in der Order Details-Tabelle ist vom Typ money. Zum Anwenden der geeigneten Typkonvertierung (vom string-Typ zum money-Typ) muss dem Wert das Dollarzeichen ($) hinzugefügt werden. Wenn im Updategram kein Zuordnungsschema angegeben ist, wird das erste Zeichen des string-Werts ausgewertet. Wenn das erste Zeichen ein Dollarzeichen ($) ist, wird die entsprechende Konvertierung angewendet.
Wenn für das Updategram ein Zuordnungsschema angegeben wird, in dem die Spalte als dt:type="fixed.14.4" bzw. sql:datatype="money" markiert ist, ist das Dollarzeichen ($) nicht erforderlich, und die Konvertierung wird anhand der Zuordnung ausgeführt. Dies ist die empfohlene Methode, um sicherzustellen, dass die richtige Typkonvertierung stattfindet.
So testen Sie eine XPath-Beispielabfrage mit dem Schema
Kopieren Sie das oben stehende Updategram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen UpdategramSpacesInTableName.xml.
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um die Vorlage auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.
D. Verwenden des at-identity-Attributs, um den in die Spalte vom Typ IDENTITY eingefügten Wert abzurufen
Das folgende Updategram fügt zwei Datensätze ein: einen in die Sales.SalesOrderHeader-Tabelle und einen in die Sales.SalesOrderDetail-Tabelle.
Zuerst fügt das Updategram der Sales.SalesOrderHeader-Tabelle einen Datensatz hinzu. In dieser Tabelle ist SalesOrderID eine Spalte vom Typ IDENTITY. Daher verwendet das Updategram das at-identity-Attribut, wenn Sie der Tabelle diesen Datensatz hinzufügen, um den zugeordneten SalesOrderID-Wert als "x" (einen Platzhalterwert) zu erfassen. Dann gibt das Updategram diese at-identity-Variable als den Wert des SalesOrderID-Attributs im <Sales.SalesOrderDetail>-Element an.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<Sales.SalesOrderHeader updg:at-identity="x"
RevisionNumber="1"
OrderDate="2001-07-01 00:00:00.000"
DueDate="2001-07-13 00:00:00.000"
OnlineOrderFlag="0"
CustomerID="676"
ContactID="378"
BillToAddressID="985"
ShipToAddressID="985"
ShipMethodID="5"
SubTotal="24643.9362"
TaxAmt="1971.5149"
Freight="616.0984"
rowguid="00001111-2222-3333-4444-556677889900"
ModifiedDate="2001-07-08 00:00:00.000" />
<Sales.SalesOrderDetail SalesOrderID="x"
LineNumber="1"
OrderQty="1"
ProductID="776"
SpecialOfferID="1"
UnitPrice="2429.9928"
UnitPriceDiscount="0.00"
rowguid="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
ModifiedDate="2001-07-01 00:00:00.000" />
</updg:after>
</updg:sync>
</ROOT>
Wenn Sie den vom updg:at-identity-Attribut generierten Identitätswert zurückgeben möchten, können Sie das updg:returnid-Attribut verwenden. Es folgt ein überarbeitetes Updategram, das diesen Identitätswert zurückgibt. (Dieses Updategram fügt zwei Order-Datensätze und zwei Order Detail-Datensätze hinzu, um das Beispiel ein bisschen zu komplizieren.)
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync>
<updg:before>
</updg:before>
<updg:after updg:returnid="x y" >
<HumanResources.Shift updg:at-identity="x" Name="Day-Evening"
StartTime="1900-01-01 11:00:00.000"
EndTime="1900-01-01 19:00:00.000"
ModifiedDate="2004-01-01 00:00:00.000" />
<HumanResources.Shift updg:at-identity="y" Name="Evening-Night"
StartTime="1900-01-01 19:00:00.000"
EndTime="1900-01-01 03:00:00.000"
ModifiedDate="2004-01-01 00:00:00.000" />
</updg:after>
</updg:sync>
</ROOT>
Wenn das Updategram ausgeführt wird, gibt es Ergebnisse wie die folgenden zurück, unter anderem den Identitätswert (den generierten Wert der für Tabellenidentität verwendeten ShiftID-Spalte):
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<returnid>
<x>4</x>
<y>5</y>
</returnid>
</ROOT>
So testen Sie eine XPath-Beispielabfrage mit dem Schema
Kopieren Sie das oben stehende Updategram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen Updategram-returnId.xml.
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um die Vorlage auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.
E. Verwenden des updg:guid-Attributs, um einen eindeutigen Wert zu generieren
In diesem Beispiel fügt das Updategram einen Datensatz in die Tabellen Cust und CustOrder ein. Das Updategram generiert außerdem einen eindeutigen Wert für das CustomerID-Attribut mithilfe des updg:guid-Attributs.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after updg:returnid="x" >
<Cust updg:guid="x" >
<CustID>x</CustID>
<LastName>Fuller</LastName>
</Cust>
<CustOrder>
<CustID>x</CustID>
<OrderID>1</OrderID>
</CustOrder>
</updg:after>
</updg:sync>
</ROOT>
Das Updategram gibt das returnid-Attribut an. Als Ergebnis wird der generierte GUID zurückgegeben:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<returnid>
<x>7111BD1A-7F0B-4CEE-B411-260DADFEFA2A</x>
</returnid>
</ROOT>
So testen Sie das Updategram
Kopieren Sie das oben stehende Updategram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen Updategram-GenerateGuid.xml.
Erstellen Sie die folgenden Tabellen:
USE tempdb CREATE TABLE Cust (CustID uniqueidentifier, LastName varchar(20)) CREATE TABLE CustOrder (CustID uniqueidentifier, OrderID int)
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um die Vorlage auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.
F. Angeben eines Schemas in einem Updategram
Das Updategram in diesem Beispiel fügt einen Datensatz in die folgende Tabelle ein:
CustOrder(OrderID, EmployeeID, OrderType)
In diesem Updategram wird ein XSD-Schema angegeben (d. h. es gibt keine Standardzuordnung von Updategram-Elementen und -Attributen). Die erforderliche Zuordnung der Elemente und Attribute zu den Datenbanktabellen und -spalten erfolgt durch das Zuordnungsschema.
Das folgende Schema (CustOrderSchema.xml) beschreibt ein <CustOrder>-Element, das aus dem OrderID-Attribut und dem EmployeeID-Attribut besteht. Um das Schema interessanter zu machen, wird dem EmployeeID-Attribut ein Standardwert zugewiesen. Ein Updategram verwendet den Standardwert eines Attributs nur bei Einfügevorgängen, und auch dann nur, wenn das Updategram kein anderes Attribut angibt.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="CustOrder" >
<xsd:complexType>
<xsd:attribute name="OrderID" type="xsd:integer" />
<xsd:attribute name="EmployeeID" type="xsd:integer" />
<xsd:attribute name="OrderType " type="xsd:integer" default="1"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Dieses Updategram fügt einen Datensatz in die CustOrder-Tabelle ein. Das Updategram gibt nur die Attributwerte für OrderID und EmployeeID an. Der Attributwert für OrderType wird nicht angegeben. Daher verwendet das Updategram den Standardwert des EmployeeID-Attributs, das im vorhergehenden Schema angegeben ist.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"
xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema='CustOrderSchema.xml'>
<updg:after>
<CustOrder OrderID="98000" EmployeeID="1" />
</updg:after>
</updg:sync>
</ROOT>
Weitere Beispiele für Updategrams, die Zuordnungsschemas angeben, finden Sie unter Angeben eines Zuordnungsschemas mit Anmerkungen in einem Updategram (SQLXML 4.0).
So testen Sie das Updategram
Erstellen Sie diese Tabelle in der tempdb-Datenbank:
USE tempdb CREATE TABLE CustOrder( OrderID int, EmployeeID int, OrderType int)
Kopieren Sie das oben stehende Schema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen CustOrderSchema.xml.
Kopieren Sie das oben stehende Updategram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als CustOrderUpdategram.xml in demselben Ordner, den Sie im vorherigen Schritt verwendet haben.
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um das Updategram auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.
Dies ist das entsprechende XDR-Schema:
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<ElementType name="CustOrder" >
<AttributeType name="OrderID" />
<AttributeType name="EmployeeID" />
<AttributeType name="OrderType" default="1" />
<attribute type="OrderID" />
<attribute type="EmployeeID" />
<attribute type="OrderType" />
</ElementType>
</Schema>
G. Verwenden des xsi:nil-Attributs, um NULL-Werte in eine Spalte einzufügen
Zum Einfügen eines NULL-Werts in die entsprechende Spalte der Tabelle können Sie das xsi:nil-Attribut in einem Element in einem Updategram angeben. Im entsprechenden XSD-Schema muss auch das XSD-nillable-Attribut angegeben werden.
Das folgende XSD-Schema ist ein Beispiel dafür:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Student" sql:relation="Students">
<xsd:complexType>
<xsd:all>
<xsd:element name="fname" sql:field="first_name"
type="xsd:string"
nillable="true"/>
</xsd:all>
<xsd:attribute name="SID"
sql:field="StudentID"
type="xsd:ID"/>
<xsd:attribute name="lname"
sql:field="last_name"
type="xsd:string"/>
<xsd:attribute name="minitial"
sql:field="middle_initial"
type="xsd:string"/>
<xsd:attribute name="years"
sql:field="no_of_years"
type="xsd:integer"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Das XSD-Schema gibt für das <fname>-Element nillable="true" an. Das folgende Updategram verwendet dieses Schema:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"
xmlns:updg="urn:schemas-microsoft-com:xml-updategram"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<updg:sync mapping-schema='StudentSchema.xml'>
<updg:before/>
<updg:after>
<Student SID="S00004" lname="Elmaci" minitial="" years="2">
<fname xsi:nil="true">
</fname>
</Student>
</updg:after>
</updg:sync>
</ROOT>
Das Updategram gibt für das <fname>-Element im <after>-Block xsi:nil an. Daher wird beim Ausführen dieses Updategrams für die first_name-Spalte in der Tabelle der Wert NULL eingefügt.
So testen Sie das Updategram
Erstellen Sie die folgende Tabelle in der Datenbank tempdb:
USE tempdb CREATE TABLE Students ( StudentID char(6)NOT NULL , first_name varchar(50), last_name varchar(50), middle_initial char(1), no_of_years int NULL) GO
Kopieren Sie das oben stehende Schema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen StudentSchema.xml.
Kopieren Sie das oben stehende Updategram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als StudentUpdategram.xml in demselben Ordner, den Sie im vorherigen Schritt zum Speichern der Datei StudentSchema.xml verwendet haben.
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um das Updategram auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.
H. Angeben von Namespaces in einem Updategram
In einem Updategram können Elemente vorhanden sein, die zu einem in demselben Element im Updategram deklarierten Namespace gehören. In diesem Fall muss auch in dem entsprechenden Schema derselbe Namespace deklariert sein, und das Element muss diesem Zielnamespace angehören.
Beispielsweise gehört im folgenden Updategram (UpdateGram-ElementHavingNamespace.xml) das <Order>-Element zu einem im Element deklarierten Namespace.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema='XSD-ElementHavingNameSpace.xml'>
<updg:after>
<x:Order xmlns:x="https://server/xyz/schemas/"
updg:at-identity="SalesOrderID"
RevisionNumber="1"
OrderDate="2001-07-01 00:00:00.000"
DueDate="2001-07-13 00:00:00.000"
OnlineOrderFlag="0"
CustomerID="676"
ContactID="378"
BillToAddressID="985"
ShipToAddressID="985"
ShipMethodID="5"
SubTotal="24643.9362"
TaxAmt="1971.5149"
Freight="616.0984"
rowguid="00009999-8888-7777-6666-554433221100"
ModifiedDate="2001-07-08 00:00:00.000" />
</updg:after>
</updg:sync>
</ROOT>
In diesem Fall muss auch das Schema den Namespace deklarieren, wie in diesem Schema gezeigt:
Das folgende Schema (XSD-ElementHavingNamespace.xml) zeigt an, wie das entsprechende Element und die entsprechenden Attribute deklariert werden müssen.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
xmlns:x="https://server/xyz/schemas/"
targetNamespace="https://server/xyz/schemas/" >
<xsd:element name="Order" sql:relation="Sales.SalesOrderHeader" type="x:Order_type"/>
<xsd:complexType name="Order_type">
<xsd:attribute name="SalesOrderID" type="xsd:ID"/>
<xsd:attribute name="RevisionNumber" type="xsd:unsignedByte"/>
<xsd:attribute name="OrderDate" type="xsd:dateTime"/>
<xsd:attribute name="DueDate" type="xsd:dateTime"/>
<xsd:attribute name="ShipDate" type="xsd:dateTime"/>
<xsd:attribute name="Status" type="xsd:unsignedByte"/>
<xsd:attribute name="OnlineOrderFlag" type="xsd:boolean"/>
<xsd:attribute name="SalesOrderNumber" type="xsd:string"/>
<xsd:attribute name="PurchaseOrderNumber" type="xsd:string"/>
<xsd:attribute name="AccountNumber" type="xsd:string"/>
<xsd:attribute name="CustomerID" type="xsd:int"/>
<xsd:attribute name="ContactID" type="xsd:int"/>
<xsd:attribute name="SalesPersonID" type="xsd:int"/>
<xsd:attribute name="TerritoryID" type="xsd:int"/>
<xsd:attribute name="BillToAddressID" type="xsd:int"/>
<xsd:attribute name="ShipToAddressID" type="xsd:int"/>
<xsd:attribute name="ShipMethodID" type="xsd:int"/>
<xsd:attribute name="CreditCardID" type="xsd:int"/>
<xsd:attribute name="CreditCardApprovalCode" type="xsd:string"/>
<xsd:attribute name="CurrencyRateID" type="xsd:int"/>
<xsd:attribute name="SubTotal" type="xsd:decimal"/>
<xsd:attribute name="TaxAmt" type="xsd:decimal"/>
<xsd:attribute name="Freight" type="xsd:decimal"/>
<xsd:attribute name="TotalDue" type="xsd:decimal"/>
<xsd:attribute name="Comment" type="xsd:string"/>
<xsd:attribute name="rowguid" type="xsd:string"/>
<xsd:attribute name="ModifiedDate" type="xsd:dateTime"/>
</xsd:complexType>
</xsd:schema>
So testen Sie das Updategram
Kopieren Sie das oben stehende Schema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen XSD-ElementHavingNamespace.xml.
Kopieren Sie das oben stehende Updategram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als Updategram-ElementHavingNamespace.xml in demselben Ordner, den Sie im vorherigen Schritt zum Speichern der Datei XSD-ElementHavingnamespace.xml verwendet haben.
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um das Updategram auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.
I. Einfügen von Daten in eine Spalte vom Datentyp XML
Der xml-Datentyp wurde in SQL Server 2005 eingeführt. Sie können Updategrams verwenden, um in Spalten vom Typ xml gespeicherte Daten einzufügen und zu aktualisieren. Dabei gelten folgende Bedingungen:
Die xml-Spalte kann nicht zum Identifizieren einer vorhandenen Zeile verwendet werden. Deshalb kann sie nicht im updg:before-Abschnitt eines Updategrams enthalten sein.
Namespaces, die sich im Bereich des in die xml-Spalte eingefügten XML-Fragments befinden, werden beibehalten, und deren Namespacedeklarationen zu dem obersten Element des eingefügten Fragments hinzugefügt.
Im folgenden Updategram (SampleUpdateGram.xml) aktualisiert beispielsweise das <Desc>-Element die ProductDescription-Spalte in der Production>productModel-Tabelle der AdventureWorks-Beispieldatenbank. Das Ergebnis dieses Updategrams besteht darin, dass der XML-Inhalt der ProductDescription-Spalte mit dem XML-Inhalt des <Desc>-Elements aktualisiert wird.
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync mapping-schema="SampleSchema.xml" >
<updg:before>
<ProductModel ProductModelID="19">
<Name>Mountain-100</Name>
</ProductModel>
</updg:before>
<updg:after>
<ProductModel>
<Name>Mountain-100</Name>
<Desc><?xml-stylesheet href="ProductDescription.xsl" type="text/xsl"?>
<p1:ProductDescription xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription"
xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain"
xmlns:wf="https://www.adventure-works.com/schemas/OtherFeatures"
xmlns:html="http://www.w3.org/1999/xhtml"
>
<p1:Summary>
<html:p>Insert Example</html:p>
</p1:Summary>
<p1:Manufacturer>
<p1:Name>AdventureWorks</p1:Name>
<p1:Copyright>2002</p1:Copyright>
<p1:ProductURL>HTTP://www.Adventure-works.com</p1:ProductURL>
</p1:Manufacturer>
<p1:Features>These are the product highlights.
<wm:Warranty>
<wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>
<wm:Description>parts and labor</wm:Description>
</wm:Warranty>
<wm:Maintenance>
<wm:NoOfYears>10 years</wm:NoOfYears>
<wm:Description>maintenance contract available through your dealer or any AdventureWorks retail store.</wm:Description>
</wm:Maintenance>
<wf:wheel>High performance wheels.</wf:wheel>
<wf:saddle>
<html:i>Anatomic design</html:i> and made from durable leather for a full-day of riding in comfort.</wf:saddle>
<wf:pedal>
<html:b>Top-of-the-line</html:b> clipless pedals with adjustable tension.</wf:pedal>
<wf:BikeFrame>Each frame is hand-crafted in our Bothell facility to the optimum diameter and wall-thickness required of a premium mountain frame. The heat-treated welded aluminum frame has a larger diameter tube that absorbs the bumps.</wf:BikeFrame>
<wf:crankset> Triple crankset; alumunim crank arm; flawless shifting. </wf:crankset>
</p1:Features>
<p1:Picture>
<p1:Angle>front</p1:Angle>
<p1:Size>small</p1:Size>
<p1:ProductPhotoID>118</p1:ProductPhotoID>
</p1:Picture>
<p1:Specifications> These are the product specifications.
<Material>Almuminum Alloy</Material>
<Color>Available in most colors</Color>
<ProductLine>Mountain bike</ProductLine>
<Style>Unisex</Style>
<RiderExperience>Advanced to Professional riders</RiderExperience>
</p1:Specifications>
</p1:ProductDescription>
</Desc>
</ProductModel>
</updg:after>
</updg:sync>
</ROOT>
Das Updategram verweist auf das folgende XSD-Schema mit Anmerkungen (SampleSchema.xml).
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema"
xmlns="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
<xsd:element name="ProductModel" sql:relation="Production.ProductModel" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name" type="xsd:string"></xsd:element>
<xsd:element name="Desc" sql:field="CatalogDescription" sql:datatype="xml">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ProductDescription">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Summary" type="xsd:anyType">
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="ProductModelID" sql:field="ProductModelID"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
So testen Sie das Updategram
Kopieren Sie das oben stehende Schema, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei unter dem Dateinamen XSD-SampleSchema.xml.
Hinweis Da Updategrams die Standardzuordnung unterstützen, gibt es keine Möglichkeit, den Anfang und das Ende des xml-Datentyps zu identifizieren. Dies bedeutet, dass beim Einfügen von xml-Daten in eine Tabelle und dem Aktualisieren von Tabellen mit xml-Daten ein Zuordnungsschema erforderlich ist. Wird kein Schema bereitgestellt, gibt SQLXML einen Fehler zurück und meldet, dass eine der Spalten in der Tabelle fehlt.
Kopieren Sie das oben stehende Updategram, und fügen Sie es in eine Textdatei ein. Speichern Sie die Datei als SampleUpdategram.xml in demselben Ordner, den Sie im vorherigen Schritt zum Speichern der Datei SampleSchema.xml verwendet haben.
Erstellen und verwenden Sie das SQLXML 4.0-Testskript (Sqlxml4test.vbs), um das Updategram auszuführen.
Weitere Informationen finden Sie unter Verwenden von ADO zum Ausführen von SQLXML 4.0-Abfragen.