Приведение типов данных (схема 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 к схеме
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл с именем dataTypeXdr.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл с именем 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>
Этот 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 к схеме
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл с именем DataTypeXdr2.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл с именем 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"
Создайте и запустите тестовый сценарий 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>