Вставка данных с помощью диаграмм обновления XML (SQLXML 4.0)
Диаграмма обновления показывает операцию вставки, если экземпляр записи появляется в блоке <after>, но не в соответствующем блоке <before>. В этом случае диаграмма обновления вставляет запись в блок <after> в базу данных.
Ниже приведено формат диаграммы обновления для операции вставки:
<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>
Блок <before> может быть опущен при операции вставки. Если необязательный атрибут mapping-schema не указан, то <ElementName>, указанный в диаграмме обновления соответствует таблице базы данных, а дочерние элементы или атрибуты соответствуют столбцам таблицы.
Блок <after>
В блоке <after> можно указать одну или более записей.
Если блок <after> не предоставляет значение для конкретного столбца, то в диаграмме обновления используется значение, указанное в схеме с заметками (если схема указана). Если схема не задает значение по умолчанию для столбца, то диаграмма обновления не задает никакие явные значения для этого столбца, напротив, она назначает для этого столбца значение по умолчанию MicrosoftSQL Server (если указано). Если не существует значения по умолчанию SQL Server, и столбец принимает значение NULL, то диаграмма обновления устанавливает значение столбца в NULL. Если столбец не имеет значения по умолчанию и не принимает значение NULL, то команда завершается сбоем и диаграмма обновления возвращает ошибку. Необязательный атрибут updg:returnid используется, чтобы возвратить значение идентификатора, формируемое системой при добавлении записи в таблицу со столбцом типа IDENTITY.
Атрибут updg:id
Если диаграмма обновления добавляет только записи, то диаграмма обновления не требует атрибута updg:id. Дополнительные сведения о функции updg:id см. в разделе Обновление данных при помощи диаграмм обновления XML (SQLXML 4.0).
Атрибут updg:at-identity
Когда диаграмма обновления вставляет запись в таблицу со столбцом типа IDENTITY, диаграмма обновления может захватить назначенное системой значение с помощью необязательного атрибута updg:at-identity. Это значение потом используется диаграммой обновления в последовательных операциях. При выполнении диаграммы обновления можно возвратить формируемое значение идентификатора, указав атрибут updg:returnid.
Атрибут updg:guid
Атрибут updg:guid является необязательным атрибутом, формирующим глобальный уникальный идентификатор. Это значение остается в области для всего блока <sync> , в котором оно указано. Его можно использовать везде в блоке <sync>. Атрибут вызывает функцию NEWGUID()SQL Server, чтобы сформировать уникальный идентификатор.
Примеры
Чтобы создать рабочие образцы с использованием следующих примеров, необходимо выполнить требования, перечисленные в разделе Требования к запуску примеров SQLXML.
При использовании примеров диаграмм обновления необходимо учитывать следующие моменты.
В большинстве примеров используется сопоставление по умолчанию (то есть в диаграмме обновления схема сопоставления не задана). Некоторые примеры диаграмм обновления, в которых используются схемы сопоставления, см. в разделе Определение схемы с заметками сопоставления в диаграмме обновления (SQLXML 4.0).
В большинстве примеров задействован образец базы данных AdventureWorks. Все обновления применяются к таблицам в этой базе данных. Базу данных AdventureWorks можно восстановить. Сведения о восстановлении базы данных AdventureWorks см. в разделе Образцы баз данных AdventureWorks.
А. Вставка записи с помощью диаграммы обновления
Данная диаграмма обновления с атрибутивной моделью вставляет запись в таблицу HumanResources.Employee в базе данных AdventureWorks.
В этом примере диаграмма обновления не задает схему сопоставления. Следовательно диаграмма обновления использует сопоставление по умолчанию, при котором имя элемента сопоставляется с именем таблицы, а атрибуты или дочерние элементы сопоставляются со столбцами таблицы.
Схема AdventureWorks для таблицы HumanResources.Employee налагает ограничение «not null»' на все столбцы, кроме ManagerID и EmployeeID. Следовательно диаграмма обновления должна содержать значения, заданные для всех столбцов, за исключением этих двух столбцов. Столбец ManagerID опущен, поэтому при выполнении диаграммы обновления его значение будет равно NULL. EmployeeID является столбцом типа IDENTITY. Поэтому для него значения не указаны.
<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>
Проверка образца запроса XPath к схеме
Скопируйте приведенную выше диаграмму обновления и вставьте ее в текстовый файл. Сохраните файл под именем MyUpdategram.xml.
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
При элементном сопоставлении диаграмма обновления выглядит следующим образом:
<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>
В диаграмме обновления со смешанной моделью (элементной и атрибутивной), элемент может иметь как атрибуты, так и вложенные элементы, как показано на следующей диаграмме обновления:
<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>
Б. Вставка нескольких записей с помощью диаграммы обновления
Данная диаграмма обновления добавляет две новые записи о перемещении в таблицу HumanResources.Shift. Диаграмма обновления не задает необязательный блок <before>.
<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>
Проверка образца запроса XPath к схеме
Скопируйте приведенную выше диаграмму обновления и вставьте ее в текстовый файл. Сохраните файл под именем Updategram-AddShifts.xml.
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
Другой версией этого примера является диаграмма обновления, использующая два отдельных блока <after> вместо одного для вставки двух сотрудников. Это допустимо и может быть закодировано следующим образом:
<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>
В. Работа с допустимыми символами SQL Server, не являющимися допустимыми в XML
В SQL Server имена таблиц могут содержать пробелы, например как таблица Order Details в базе данных Northwind. Однако, это недопустимо в XML-идентификаторах, но допустимо в идентификаторах SQL Server; символ, не являющийся допустимым символом в XML-идентификаторах экранируется в виде _xHHHH_, где HHHH обозначает четырехразрядный шестнадцатеричный код UCS-2 для символа, в порядке старшинства бит.
Примечание |
|---|
В этом примере используется база данных Northwind, которая в версии SQL Server 2000 являлась образцом базы данных. В более поздних версиях SQL Server база данных Northwind не содержится. Однако, можно установить базу данных Northwind с помощью доступного для загрузки сценария SQL. Дополнительные сведения см. в разделе Загрузка образцов баз данных Northwind и pubs. |
Кроме того, имя элемента должно быть заключено в квадратные скобки ([ ]). Поскольку символы [ и ] не являются допустимыми в XML, их необходимо экранировать как _x005B_ и _x005D_ соответственно. (Если используется схема сопоставления, то можно предоставить имена элементов, не содержащие недопустимых символов, таких, как пробелы. Схема сопоставления выполняет необходимое сопоставление; следовательно, необязательно экранировать эти символы).
Данная диаграмма обновления добавляет запись в таблицу Order Details в базе данных Northwind:
<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>
Столбец UnitPrice в таблице Order Details имеет тип money. Чтобы применить надлежащее преобразование типов (из типа string к типу money), необходимо добавить как часть значения символ доллара ($). Если диаграмма обновления не задает схему сопоставления, то берется первый символ значения string. Если первый символ это символ доллара ($), то применяется соответствующее преобразование.
Если диаграмма обновления указана для схемы сопоставления, где столбец помечен соответственно как dt:type="fixed.14.4" или sql:datatype="money", то символ доллара ($) не требуется и преобразование обрабатывается сопоставлением. Это рекомендуемый способ, который гарантирует, что надлежащее преобразование типов происходит.
Проверка образца запроса XPath к схеме
Скопируйте приведенную выше диаграмму обновления и вставьте ее в текстовый файл. Сохраните файл под именем UpdategramSpacesInTableName.xml.
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
Г. Использование атрибута at-identity для получения значения, вставленного в столбец типа типа IDENTITY
Следующая диаграмма обновления вставляет две записи: одну в таблицу Sales.SalesOrderHeader, а другую в таблицу Sales.SalesOrderDetail.
Сначала диаграмма обновления добавляет запись в таблицу Sales.SalesOrderHeader. В этой таблице столбец SalesOrderID является столбцом типа IDENTITY. Поэтому при добавлении этой записи в таблицу диаграмма обновления использует атрибут at-identity, чтобы записать присвоенное SalesOrderID значение как "x" (значение местозаполнителя). Затем диаграмма обновления указывает эту переменную at-identity в качестве значения атрибута SalesOrderID в элементе <Sales.SalesOrderDetail>.
<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>
Если необходимо вернуть значение идентификатора, формируемое атрибутом updg:at-identity, можно использовать атрибут updg:returnid. Ниже показана исправленная диаграмма обновления, которая возвращает значение идентификатора. (Эта диаграмма обновления добавляет две записи заказа и две записи подробностей заказа, чтобы немного усложнить пример.)
<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>
При выполнении диаграммы обновления она возвращает результат, подобный следующему, который содержит сформированное значение идентификатора (сформированное значение столбца ShiftID, используемого для идентификатора таблицы):
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <returnid> <x>4</x> <y>5</y> </returnid> </ROOT>
Проверка образца запроса XPath к схеме
Скопируйте приведенную выше диаграмму обновления и вставьте ее в текстовый файл. Сохраните файл под именем Updategram-returnId.xml.
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
Д. Использование атрибута updg:guid для формирования уникального значения
В этом примере диаграмма обновления вставляет запись в таблицы Cust и CustOrder. Также диаграмма обновления формирует уникальное значение атрибута CustomerID, используя атрибут updg:guid.
<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>
Диаграмма обновления задает атрибут returnid. В результате возвращается сформированное значение GUID:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram"> <returnid> <x>7111BD1A-7F0B-4CEE-B411-260DADFEFA2A</x> </returnid></ROOT>
Тестирование диаграммы обновления
Скопируйте приведенную выше диаграмму обновления и вставьте ее в текстовый файл. Сохраните файл под именем Updategram-GenerateGuid.xml.
Создайте следующие таблицы.
USE tempdbCREATE TABLE Cust (CustID uniqueidentifier, LastName varchar(20))CREATE TABLE CustOrder (CustID uniqueidentifier, OrderID int)Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
Е. Задание схемы в диаграмме обновления
Диаграмма обновления в этом примере вставляет запись в следующую таблицу:
CustOrder(OrderID, EmployeeID, OrderType)
В этой диаграмме обновления указана схема XSD (то есть нет сопоставления по умолчанию элементов и атрибутов диаграммы обновления). Схема обеспечивает необходимое сопоставление элементов и атрибутов таблицам и столбцам базы данных.
Следующая схема (CustOrderSchema.xml) описывает элемент <CustOrder>, который состоит из атрибутов OrderID и EmployeeID. Чтобы сделать схему более интересной, значение по умолчанию назначено атрибуту EmployeeID. В диаграмме обновления значение атрибута по умолчанию используется только для операций вставки, и только если диаграмма обновления не задает этот атрибут.
<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>
Эта диаграмма обновления производит вставку записи в таблицу CustOrder. Диаграмма обновления задает только значения атрибутов OrderID и EmployeeID. Она не задает значение атрибута OrderType. Поэтому в диаграмме обновления используется значение по умолчанию для атрибута EmployeeID, заданного в предшествующей схеме .
<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>
Некоторые примеры диаграмм обновления, которые задают схемы сопоставления, см. в разделе Определение схемы с заметками сопоставления в диаграмме обновления (SQLXML 4.0).
Тестирование диаграммы обновления
Создайте следующую таблицу в базе данных tempdb.
USE tempdbCREATE TABLE CustOrder( OrderID int, EmployeeID int, OrderType int)Скопируйте приведенную выше схему и вставьте ее в текстовый файл. Сохраните файл под именем CustOrderSchema.xml.
Скопируйте приведенную выше диаграмму обновления и вставьте ее в текстовый файл. Сохраните файл под именем CustOrderUpdategram.xml в той же папке, которая используется в предыдущем шаге.
Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
Эквивалентная схема XDR:
<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>
Ж. Использование атрибута xsi:nil для вставки в столбец нулевых значений
Если необходимо вставить нулевое значение в соответствующий столбец таблицы, можно указать атрибут xsi:nil для элемента в диаграмме обновления. Также необходимо указать атрибут XSD nillable в соответствующей схеме XSD.
В качестве примера рассмотрим следующую схему XSD.
<?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>
Схема XSD задает nillable="true" для элемента <fname>. Следующая диаграмма обновления использует эту схему:
<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>
Диаграмма обновления задает xsi:nil для элемента <fname> в блоке <after>. Поэтому при выполнении этой диаграммы обновления значение NULL вставляется для столбца first_name таблицы.
Тестирование диаграммы обновления
Создайте следующую таблицу в базе данных tempdb.
USE tempdbCREATE 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Скопируйте приведенную выше схему и вставьте ее в текстовый файл. Сохраните файл под именем StudentSchema.xml.
Скопируйте приведенную выше диаграмму обновления и вставьте ее в текстовый файл. Сохраните файл под именем StudentUpdategram.xml в той же папке, которая использовалась на предыдущем шаге для сохранения файла StudentSchema.xml.
Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
З. Задание пространства имен в диаграмме обновления
Диаграмма обновления может содержать элементы, которые принадлежат пространству имен, объявленному в этом же элементе диаграммы обновления. В этом случае соответствующая схема также должна объявлять то же пространство имен и элемент должен принадлежать этому целевому пространству имен.
Например, в следующей диаграмме обновления (UpdateGram-ElementHavingNamespace.xml) элемент <Order> принадлежит пространству имен, объявленному в элементе.
<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>
В этом случае схема должна тоже объявлять пространство имен, как показано в следующей схеме:
Следующая схема (XSD-ElementHavingNamespace.xml) показывает, как должен быть объявлен соответствующий элемент и атрибуты.
<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>
Тестирование диаграммы обновления
Скопируйте приведенную выше схему и вставьте ее в текстовый файл. Сохраните файл под именем XSD-ElementHavingNamespace.xml.
Скопируйте приведенную выше диаграмму обновления и вставьте ее в текстовый файл. Сохраните файл под именем Updategram-ElementHavingNamespace.xml в той же папке, в которой был сохранен файл XSD-ElementHavingnamespace.xml.
Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
И. Вставка данных в столбец типа XML
В SQL Server 2005 появился тип данных xml. Диаграммы обновления можно использовать для вставки и обновления данных, хранимых в столбцах типа xml при следующих условиях:
Столбец xml невозможно использовать для идентификации существующей строки. Поэтому его невозможно включить в область updg:before диаграммы обновления.
Пространства имен в пределах фрагмента XML, добавленные в столбец xml, будут сохранены, и объявления пространства имен будут добавлены в верхний элемент вставленного фрагмента.
Например, в следующей диаграмме обновления (SampleUpdateGram.xml) элемент <Desc> обновляет столбец ProductDescription column в таблице Production>productModel в образце базы данных AdventureWorks. Результатом этой диаграммы обновления является то, что XML-содержимое столбца ProductDescription обновляется XML-содержимым элемента <Desc>.
<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>
Диаграмма обновления ссылается на следующую схему XSD с заметками (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>
Тестирование диаграммы обновления
Скопируйте приведенную выше схему и вставьте ее в текстовый файл. Сохраните файл под именем XSD-SampleSchema.xml.
ПримечаниеТак как диаграмма обновления поддерживает сопоставление по умолчанию, не существует способа идентифицировать начало и конец типа данных xml. Это фактически означает, что при вставке или обновлении таблиц с помощью столбцов типа xml необходима схема сопоставления. Если схема не предоставляется, SQLXML возвращает ошибку, указывающую, что один из столбцов пропущен в таблице.
Скопируйте приведенную выше диаграмму обновления и вставьте ее в текстовый файл. Сохраните файл под именем SampleUpdategram.xml в том же каталоге, где был сохранен файл SampleSchema.xml.
Создайте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs) и воспользуйтесь им для выполнения диаграммы обновления.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.