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


Приведение типов данных (схема XDR)

Важное примечаниеВажно!

Этот раздел включен в документацию в качестве справочника по приложениям прежних версий. Дальнейшая разработка этой функции проводиться не будет. Рекомендуется избегать использования данной функции в новых разработках. Вместо этого для создания XML-представлений пользуйтесь схемами XSD с заметками. Дополнительные сведения см. в разделе Введение в схемы XSD с заметками (SQLXML 4.0). Можно преобразовать существующие схемы XDR с заметками в схемы XSD. Дополнительные сведения см. в разделе Преобразование схем XDR с заметками в эквивалентные схемы XSD (SQLXML 4.0).

Тип данных элемента или атрибута может быть указан в схеме XDR. Когда схема XDR используется для получения данных из базы данных, подходящий формат данных выводится в качестве результата запроса. Заметки dt:type и sql:datatype используются для управления сопоставлением между типами данных XDR и типами данных Microsoft SQL Server.

dt:type

Атрибут dt:type позволяет задать тип данных XML атрибута или элемента, сопоставляемого со столбцом. Атрибут dt:type может быть указан в <AttributeType> или <ElementType>. Атрибут dt:type влияет на документ, который возвращает сервер, а также на выполняемый запрос XPath. Когда вместо схемы, содержащей атрибут dt:type, выполняется запрос XPath, XPath использует тип данных, указанный при обработке запроса. Дополнительные сведения об использовании dt:type в XPath см. в разделе Типы данных XPath (SQLXML 4.0).

В возвращенном документе все типы данных SQL Server преобразуются в строковые представления. Для некоторых типов данных необходимо дополнительное преобразование. В следующей таблице перечислены виды преобразования, которые применяются для различных значений dt:type.

тип данных xml

Преобразование SQL Server

Тип данных bit

CONVERT(bit, COLUMN)

date;

LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10)

fixed.14.4

CONVERT(money, COLUMN)

id/idref/idrefs

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

nmtoken/nmtokens

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

time/time.tz

SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24)

Все остальные

Дополнительное преобразование не выполняется

Необходимо отметить, что некоторые значения SQL Server не могут быть преобразованы в типы данных XML либо потому, что преобразование невозможно (например, "XYZ" в числовой тип данных) либо потому, что значение выходит за допустимые пределы этого типа данных (например, -100000 преобразуется в ui2). Невозможные преобразования типа могут привести к недопустимым XML-документам или ошибкам SQL Server.

Сопоставление типов данных SQL Server с типами данных XML

Таблица показывает естественное сопоставление типов данных SQL Server с типами данных XML.

Тип данных SQL Server

тип данных xml

bigint

i8

binary

bin.base64

bit

boolean

char

char

datetime

datetime

decimal

r8

float

r8

image

bin.base64

int

int

money

r8

nchar

string

ntext

string

nvarchar

string

numeric

r8

real

r4

smalldatetime

datetime

smallint

i2

smallmoney

fixed.14.4

sysname

string

text

string

timestamp

ui8

tinyint

ui1

varbinary

bin.base64

varchar

string

uniqueidentifier

uuid

sql:datatype

Тип данных XML bin.base64 сопоставляется с различными типами данных Microsoft SQL Server (binary, image, varbinary). Чтобы однозначно сопоставить тип данных XML bin.base64 с конкретными данными SQL Server, используется заметка sql:datatype. Заметка sql:datatype определяет тип данных SQL Server столбца, с которым сопоставлен атрибут.

Это полезно, когда данные хранятся в базе данных. Указав заметку sql:datatype, можно явным образом указать тип данных SQL Server. Тогда элемент данных сохраняется как тип, указанный в заметке sql:datatype.

Заметка sql:datatype поддерживает все встроенные типы данных SQL Server. (Определяемые пользователем типы данных или синонимы не поддерживаются.) Точность и масштаб также поддерживаются, например, sql:datatype="nvarchar"and sql:datatype="nchar(10)".

Указание XDR и типов данных SQL Server в схеме сопоставления может помочь исключить ненужные преобразования данных в запросах SQL. Например, необходимо, чтобы XPath преобразовал тип данных SQL Server в тип данных XDR, а затем из типа XDR - в тип XPath. Когда указаны заметка sql:datatype или тип XDR, а XPath определяет отсутствие необходимости в преобразовании, XPath не производит его.

В случае работы со столбцами первичного ключа исключение этих преобразований может значительно повысить производительность. Например, следующий запрос обычно требует преобразования CustomerID в строку (nvarchar) для гарантии правильного результата:

Customer[@CustomerID='ALFKI']

Если CustomerID аннотируется в схеме с sql:datatype="nvarchar", XPath может избежать необязательного преобразования данных.

Примеры

Чтобы создать рабочие образцы на основе следующих примеров, необходимо выполнить определенные требования. Дополнительные сведения см. в разделе Требования к запуску примеров SQLXML.

А. Укажите dt:type в атрибуте

В этой схеме XDR dt:type указан в атрибутах OrdDate и ShipDate.

Для атрибута ReqDate тип данных XPath не указан. Поэтому XPath возвращает значения типа datetime SQL Server, полученные из столбца RequiredDate базы данных.

Тип данных XPath "date" указан в атрибуте OrdDate. XPath возвращает только часть "date" (но не "time") значений, полученных из столбца OrderDate.

Тип данных XPath "time" указан в атрибуте ShipDate. XPath возвращает только часть "time" (но не "date") значений, полученных из столбца ShippedDate.

<?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="Order" sql:relation="Orders">    <AttributeType name="OID" />    <AttributeType name="CustID"  />    <AttributeType name="OrdDate" dt:type="date" />    <AttributeType name="ReqDate" />    <AttributeType name="ShipDate" dt:type="time" />    <attribute type="OID" sql:field="OrderID" />    <attribute type="CustID" sql:field="CustomerID" />    <attribute type="OrdDate" sql:field="OrderDate" />    <attribute type="ReqDate" sql:field="RequiredDate" />    <attribute type="ShipDate" sql:field="ShippedDate" /></ElementType></Schema>

Проверка образца запроса XPath к схеме

  1. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл с именем dataTypeXdr.xml.

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл с именем dataTypeXdrT.xml в тот же каталог, куда уже был сохранен файл dataTypeXdr.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <sql:xpath-query mapping-schema="dataTypeXdr.xml">    /Order[@OID=43860]  </sql:xpath-query></ROOT>
    
  3. Этот URL-адрес выполняет шаблон:

    http://IISServer/AdventureWorks/template/dataTypeXdrT.xml
    

Полученный результирующий набор показан ниже.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <Order OID="43860" CustID="1" OrdDate="2001-08-01" ReqDate="2001-08-13T00:00:00" ShipDate="00:00:00" /> </ROOT>

Б. Укажите sql:datatype в шаблоне

В данном примере заметка sql:datatype используется для определения типа данных SQL Server столбца LargePhoto.

<?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="ProductPhoto" sql:relation="Production.ProductPhoto">    <AttributeType name="PhotoID" />    <AttributeType name="filename" />    <AttributeType name="photo" sql:datatype="image"  />    <attribute type="PhotoID" sql:field="ProductPhotoID" />    <attribute type="filename" sql:field="LargePhotoFileName" />    <attribute type="photo" sql:field="LargePhoto" /></ElementType></Schema>

Проверка образца запроса XPath к схеме

  1. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл с именем DataTypeXdr2.xml.

  2. Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл с именем DataTypeXdr2T.xml в тот же каталог, куда уже был сохранен файл DataTypeXdr2.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  <sql:xpath-query mapping-schema="DataTypeXdr2.xml">    /ProductPhoto[@PhotoID="100"]  </sql:xpath-query></ROOT>
    

    Указанный для схемы сопоставления путь к каталогу (DataTypeXdr2.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:

    mapping-schema="C:\MyDir\DataTypeXdr2.xml"
    
  3. Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.

    Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.

Полученный результирующий набор показан ниже.

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">     <ProductPhoto PhotoID="100" filename="racer02_red_large.gif"  photo="Binary_base64_image_returned_here"/> </ROOT>