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


Приведение типов данных и заметка 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

Следующая таблица показывает очевидные сопоставления типов данных 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 в базе данных База данных AdventureWorks2008R2.

<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="2005-07-01" 
         DueDate="2005-07-13T00:00:00" 
         ShipDate="00:00:00" /> 
  <Order SalesOrderID="43660" 
         CustomerID="117" 
         OrderDate="2005-07-01" 
         DueDate="2005-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 в схеме.