Поделиться через


Использование схем XSD с заметками в запросах (SQLXML 4.0)

Можно указать запросы по схеме с заметками, чтобы получать данные из базы данных, указывая запросы XPath в шаблоне по XSD-схеме.

Элемент <sql:xpath-query> позволяет указать запрос XPath к XML-представлению, определенному схемой с заметками. Схема с заметками, по которой будет выполнен запрос XPath, идентифицируется с использованием атрибута mapping-schema элемента <sql:xpath-query>.

Шаблоны являются допустимыми XML-документами, которые содержат один или несколько запросов. Запросы FOR XML и XPath возвращают фрагмент документа. Шаблоны выполняют роль контейнеров для фрагментов документов; таким образом шаблоны обеспечивают способ указать один элемент верхнего уровня.

В примерах, приведенных в этом разделе, шаблоны задают запрос XPath по схеме с заметками для получения данных из базы данных.

В качестве примера рассмотрим схему с заметками:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"             xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  <xsd:element name="Person.Contact" >     <xsd:complexType>       <xsd:attribute name="ContactID" type="xsd:string" />        <xsd:attribute name="FirstName" type="xsd:string" />        <xsd:attribute name="LastName"  type="xsd:string" />      </xsd:complexType>  </xsd:element></xsd:schema>

Для иллюстрации эта XSD-схема хранится в файле с именем Schema2.xml. Затем можно направить задать запрос XPath по схеме с заметками, указанной в следующем файле шаблона (Schema2T.xml):

<sql:xpath-query      xmlns:sql="urn:schemas-microsoft-com:xmlsql"     >          Person.Contact[@ContactID="1"]</sql:xpath-query>

Затем можно создать и запустить тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить запрос, как часть файла шаблона. Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.

Использование встроенных схем сопоставления

Схему с заметками можно включить непосредственно в шаблон, а затем задать запрос XPath в шаблоне по встроенной схеме. Шаблон может также быть диаграммой обновления.

Шаблон может включать несколько встроенных схем. Для использования встроенной схемы, включенной в шаблон, укажите атрибут id с уникальным значением на элементе <xsd:schema>, а затем используйте #idvalue для ссылки на встроенную схему. Поведение атрибута id идентично sql:id ({urn:schemas-microsoft-com:xml-sql}id), используемому в XDR-схемах. Дополнительные сведения см. в разделе Использование схем XDR с заметками в запросах (является устаревшим в SQLXML 4.0).

Например, следующий шаблон указывает две встроенные схемы с заметками:

<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'><xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'        id='InLineSchema1' sql:is-mapping-schema='1'>  <xsd:element name='Employees' ms:relation='HumanResources.Employee'>    <xsd:complexType>      <xsd:attribute name='LoginID'                      type='xsd:string'/>      <xsd:attribute name='Title'                      type='xsd:string'/>    </xsd:complexType>  </xsd:element></xsd:schema><xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'        xmlns:ms='urn:schemas-microsoft-com:mapping-schema'        id='InLineSchema2' sql:is-mapping-schema='1'>  <xsd:element name='Contacts' ms:relation='Person.Contact'>    <xsd:complexType>      <xsd:attribute name='ContactID'                      type='xsd:string' />      <xsd:attribute name='FirstName'                      type='xsd:string' />      <xsd:attribute name='LastName'                      type='xsd:string' />    </xsd:complexType>  </xsd:element></xsd:schema><sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql'         mapping-schema='#InLineSchema1'>    /Employees[@LoginID='adventure-works\guy1']</sql:xpath-query><sql:xpath-query xmlns:sql='urn:schemas-microsoft-com:xml-sql'         mapping-schema='#InLineSchema2'>    /Contacts[@ContactID='1']</sql:xpath-query></ROOT>

Шаблон также задает два запроса XPath. Каждый элемент <xpath-query> уникально идентифицирует схему сопоставления, указывая атрибут mapping-schema.

При задании встроенной схемы в шаблоне заметка sql:is-mapping-schema также должна быть указана на элементе <xsd:schema>. Заметка sql:is-mapping-schema имеет логическое значение (0 = false, 1 = true). Встроенная схема с sql:is-mapping-schema="1" обрабатывается как встроенная схема с заметками и не возвращается в XML-документе.

Заметка sql:is-mapping-schema принадлежит пространству имен шаблона urn:schemas-microsoft-com:xml-sql.

Чтобы протестировать этот пример, сохраните шаблон (InlineSchemaTemplate.xml) в локальном каталоге, а затем создайте и используйте тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон. Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.

В дополнение к указанию атрибута mapping-schema на элементе <sql:xpath-query> в шаблоне (при наличии запроса XPath) или на элементе <updg:sync> в диаграмме обновления, можно сделать следующее:

  • Укажите атрибут mapping-schema на элементе <ROOT> (глобальное объявление) в шаблоне. Затем эта схема сопоставления становится схемой по умолчанию, которая будет использоваться всеми узлами XPath и диаграмм обновления без явной заметки mapping-schema.

  • Укажите атрибут mapping schema с помощью объекта Command ADO.

Атрибут mapping-schema, указанный на элементе <xpath-query> или <updg:sync>, имеет наивысший приоритет; объект Command ADO имеет самый низкий приоритет.

Обратите внимание, что если указать запрос XPath в шаблоне и не указывать схему сопоставления, по которой выполняется запрос XPath, то запрос XPath обрабатывается как запрос типа dbobject. Например, рассмотрим следующий шаблон.

<sql:xpath-query      xmlns:sql="urn:schemas-microsoft-com:xmlsql">          Production.ProductPhoto[@ProductPhotoID='100']/@LargePhoto</sql:xpath-query>

Шаблон задает запрос XPath, но не задает схемы сопоставления. Поэтому этот запрос обрабатывается как запрос типа dbobject, в котором Production.ProductPhoto — имя таблицы, а @ProductPhotoID='100' — предикат, который находит фотографию продукта со значением идентификатора 100. @LargePhoto — столбец, из которого извлекается значение.