Приведение типов данных и заметка sql:datatype (SQLXML 4.0)
В схеме XSD атрибут xsd:type указывает тип XSD-данных элемента или атрибута. Если схема XSD используется для получения данных из базы данных, указанный тип данных используется для форматирования данных.
В дополнение к заданию XSD-типа в схеме, можно также указать тип данных Microsoft SQL Server с помощью заметки sql:datatype. Атрибуты xsd:type и sql:datatype управляют сопоставлением между типами данных XSD и типов данных SQL Server.
Атрибут xsd:type
Атрибут xsd:type позволяет задать тип данных XML атрибута или элемента, сопоставляемого со столбцом. Атрибут xsd:type влияет на документ, возвращаемый из сервера, а также выполняемый запрос XPath. При выполнении запроса XPath, направленного к схеме сопоставления, которая содержит атрибут xsd:type, XPath использует указанный тип данных при обработке запроса. Дополнительные сведения об использовании xsd:type в XPath см. в разделе Сопоставление типов данных XSD с типами данных XPath (SQLXML 4.0).
В возвращенном документе все типы данных SQL Server преобразуются в строковые представления. Для некоторых типов данных необходимо дополнительное преобразование. В следующей таблице перечислены виды преобразования, которые применяются для различных значений xsd:type.
Тип данных XSD |
Преобразование SQL Server |
---|---|
Boolean |
CONVERT(bit, COLUMN) |
Date |
LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10) |
decimal |
CONVERT(money, COLUMN) |
id/idref/idrefs |
id-prefix + CONVERT(nvarchar(4000), COLUMN, 126) |
nmtoken/nmtokens |
id-prefix + CONVERT(nvarchar(4000), COLUMN, 126) |
Time |
SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24) |
Все остальные |
Дополнительное преобразование не выполняется |
![]() |
---|
Некоторые значения, возвращаемые SQL Server, могут быть несовместимыми с типами данных XML, указанными с помощью атрибута xsd:type, из-за невозможности преобразования (например, преобразование «XYZ» в тип данных decimal) или из-за превышения диапазона этого типа данных (например, преобразование -100000 в XSD-тип UnsignedShort). Преобразования несовместимых типов может привести к недопустимым XML-документам или ошибкам SQL Server. |
Сопоставление типов данных SQL Server с типами данных XSD
Следующая таблица показывает очевидные сопоставления типов lfyys[ SQL Server типам данных XSD. Если известен тип SQL Server, то в данной таблице показан соответствующий XSD-тип, который можно указать в схеме XSD.
Тип данных SQL Server |
Тип данных XSD |
---|---|
bigint |
long |
binary |
base64Binary |
bit |
boolean |
char |
string |
datetime |
dateTime |
decimal |
decimal |
float |
double |
image |
base64Binary |
int |
int |
money |
decimal |
nchar |
string |
ntext |
string |
nvarchar |
string |
numeric |
decimal |
real |
float |
smalldatetime |
dateTime |
smallint |
short |
smallmoney |
decimal |
sql_variant |
string |
sysname |
string |
text |
string |
timestamp |
dateTime |
tinyint |
unsignedByte |
varbinary |
base64Binary |
varchar |
string |
uniqueidentifier |
string |
Заметка sql:datatype
Заметка sql:datatype используется, чтобы указать тип данных SQL Server; эта заметка должна быть задана, если:
Выполняется массовая загрузка в столбец dateTimeSQL Server из XSD-типа dateTime, date или time. В этом случае необходимо определить тип данных столбца SQL Server с использованием sql:datatype="dateTime". Это правило применяется только для диаграмм обновления.
Если выполняется массовая загрузка в столбец типа SQL Serveruniqueidentifier, и XSD-значение является идентификатором GUID, который включает фигурные скобки ({ и }). Если указано sql:datatype="uniqueidentifier", фигурные скобки удаляются из значения прежде, чем оно вставляется в столбец. Если sql:datatype не указан, значение пересылается с фигурными скобками, и вставка или обновление завершается неудачей.
Тип данных XML base64Binary сопоставляется различным типам данных SQL Server (binary, image или varbinary). Для сопоставления типа данных XML base64Binary различным типам данных SQL Server, используйте заметку sql:datatype. Эта заметка указывает явный тип данных SQL Server столбца, которому сопоставляется атрибут. Это полезно, когда данные хранятся в базах данных. Указав заметку sql:datatype, можно явным образом указать тип данных SQL Server.
В основном рекомендуется задать sql:datatype в схеме.
Примеры
Чтобы создать рабочие образцы на основе следующих примеров, необходимо выполнить определенные требования. Дополнительные сведения см. в разделе Требования к запуску примеров SQLXML.
А. Задание xsd:type
Этот пример показывает, как XSD-тип date, указанный с использованием атрибута xsd:type в схеме, влияет на результирующий XML-документ. Схема обеспечивает XML-представление таблицы Sales.SalesOrderHeader в базе данных AdventureWorks.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema"> <xsd:element name="Order" sql:relation="Sales.SalesOrderHeader"> <xsd:complexType> <xsd:attribute name="SalesOrderID" type="xsd:string" /> <xsd:attribute name="CustomerID" type="xsd:string" /> <xsd:attribute name="OrderDate" type="xsd:date" /> <xsd:attribute name="DueDate" /> <xsd:attribute name="ShipDate" type="xsd:time" /> </xsd:complexType> </xsd:element></xsd:schema>
В этой схеме XSD существует три атрибута, которые возвращают значение данных из SQL Server. Если схема:
Указывает xsd:type=date на атрибуте OrderDate, отображается представляющая дату часть значения, возвращенная SQL Server для атрибута OrderDate.
Указывает xsd:type=time на атрибуте ShipDate, отображается представляющая время часть значения, возвращенная SQL Server для атрибута ShipDate.
Не задает xsd:type на атрибуте DueDate, отображается то же значение, которое возвращается SQL Server.
Проверка образца запроса XPath к схеме
Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл с именем xsdType.xml.
Скопируйте следующий шаблон и вставьте его в текстовый файл. Сохраните файл под именем xsdTypeT.xml в том же каталоге, где был сохранен файл xsdType.xml.
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:xpath-query mapping-schema="xsdType.xml"> /Order </sql:xpath-query></ROOT>
Путь к каталогу схемы сопоставления (файл xsdType.xml) задается относительно каталога, в котором сохранен шаблон. Можно также задать абсолютный путь, например:
mapping-schema="C:\SqlXmlTest\xsdType.xml"
Создайте и запустите тестовый сценарий SQLXML 4.0 (Sqlxml4test.vbs), чтобы выполнить шаблон.
Дополнительные сведения см. в разделе Использование ADO для выполнения запросов SQLXML 4.0.
Частичный результирующий набор:
<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <Order SalesOrderID="43659" CustomerID="676" OrderDate="2001-07-01" DueDate="2001-07-13T00:00:00" ShipDate="00:00:00" /> <Order SalesOrderID="43660" CustomerID="117" OrderDate="2001-07-01" DueDate="2001-07-13T00:00:00" ShipDate="00:00:00" /> ...</ROOT>
Эквивалентная схема XDR:
<?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="Sales.SalesOrderHeader"> <AttributeType name="SalesOrderID" /> <AttributeType name="CustomerID" /> <AttributeType name="OrderDate" dt:type="date" /> <AttributeType name="DueDate" /> <AttributeType name="ShipDate" dt:type="time" /> <attribute type="SalesOrderID" sql:field="OrderID" /> <attribute type="CustomerID" sql:field="CustomerID" /> <attribute type="OrderDate" sql:field="OrderDate" /> <attribute type="DueDate" sql:field="DueDate" /> <attribute type="ShipDate" sql:field="ShipDate" /></ElementType></Schema>
Б. Задание типа данных SQL с использованием sql:datatype
Примеры реализации см. пример Ж в разделе Примеры массовой загрузки XML (SQLXML 4.0). В этом примере выполняется массовая загрузка значения идентификатора GUID, включая "{" и "}". Схема в этом примере указывает sql:datatype, чтобы определить тип данных SQL Server как uniqueidentifier. В этом примере показано, когда необходимо указать sql:datatype в схеме.