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


Преобразования типов данных и заметка sql:datatype (SQLXML 4.0)

Применимо к:база данных SQL ServerAzure SQL

В схеме 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 использует указанный тип данных при обработке запроса. Дополнительные сведения о том, как XPath использует xsd:type, см. в статье Сопоставление типов данных XSD с типами данных XPath (SQLXML 4.0).

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

Тип данных XSD Преобразование SQL Server
Логическое CONVERT(bit, COLUMN)
Дата 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 в десятичный тип данных), либо из-за того, что значение превышает диапазон этого типа данных (например, -100000, преобразованный в тип XSD UnsignedShort). Несовместимые преобразования типов могут привести к недопустимым XML-документам или ошибкам SQL Server.

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

В следующей таблице показано очевидное сопоставление типов данных SQL Server с типами данных XSD. Если вы знаете тип SQL Server, эта таблица предоставляет соответствующий тип XSD, который можно указать в схеме XSD.

Тип данных SQL Server Тип данных XSD
bigint long
binary base64Binary
bit boolean
char строка
datetime dateTime
decimal decimal
float double
image base64Binary
int int
money decimal
nchar строка
ntext строка
nvarchar строка
numeric decimal
real float
smalldatetime dateTime
smallint short
smallmoney decimal
sql_variant строка
sysname строка
text строка
timestamp dateTime
tinyint unsignedByte
varbinary base64Binary
varchar строка
uniqueidentifier строка

Заметка sql:datatype

Заметка sql:datatype используется для указания типа данных SQL Server; эта заметка должна указываться в следующих случаях:

  • Выполняется массовая загрузка в столбец dateTime SQL Server из XSD типа dateTime, date или time. В этом случае необходимо определить тип данных столбца SQL Server с помощью sql:datatype="dateTime". Это правило применяется только для диаграмм обновления.

  • Выполняется массовая загрузка в столбец типа SQL Server uniqueidentifier, а значениеМ 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.

A. Указание заметки xsd:type

В этом примере показано, как тип даты XSD, заданный с помощью атрибута 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 к схеме
  1. Скопируйте приведенный выше код схемы и вставьте его в текстовый файл. Сохраните файл с именем xsdType.xml.

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