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


Использование схем 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.Person" >
     <xsd:complexType>
       <xsd:attribute name="BusinessEntityID" 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.Person[@BusinessEntityID="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='JobTitle' 
                     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='Persons' ms:relation='Person.Person'>
    <xsd:complexType>

      <xsd:attribute name='BusinessEntityID' 
                     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'>
    /Persons[@BusinessEntityID='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 — столбец, из которого извлекается значение.