Бөлісу құралы:


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

Область применения: SQL Server База данных SQL Azure

В схеме 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)
десятичное CONVERT(money, COLUMN)
id/idref/idrefs id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)
nmtoken/nmtokens id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)
Время 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 string
datetime dateTime
десятичное десятичное
float double
Изображение base64Binary
int int
money десятичное
nchar string
ntext string
nvarchar string
numeric десятичное
real float
smalldatetime dateTime
smallint short
smallmoney десятичное
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". Это правило применяется только для диаграмм обновления.

  • Массовая загрузка в столбец типа uniqueidentifier SQL Server, а значение XSD — это GUID, включающий фигурные скобки ({ и }). При указании sql:datatype="uniqueidentifier" фигурные скобки удаляются из значения перед вставкой в столбец. Если sql:datatype не указан, значение отправляется с фигурными скобками, а вставка или обновление завершается ошибкой.

  • Тип данных XML base64Binary сопоставляется с различными типами данных SQL Server (двоичными, изображениями или varbinary). Чтобы сопоставить тип данных XML base64Binary с определенным типом данных SQL Server, используйте заметку sql:datatype . Эта заметка указывает явный тип данных SQL Server столбца, с которым сопоставляется атрибут. Это полезно, если данные сохраняются в базах данных. Указав заметку sql:datatype , можно определить явный тип данных SQL Server.

Обычно рекомендуется указать sql:datatype в схеме.

Примеры

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

А. Указание заметки 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>  

B. Указание типа данных SQL с помощью заметки sql:datatype

Рабочий пример см. в примере G в примерах массовой загрузки XML (SQLXML 4.0). В этом примере выполняется массовая загрузка значения идентификатора GUID, включая "{" и "}". Схема в этом примере указывает sql:datatype, чтобы определить тип данных SQL Server как уникальный идентификатор. В этом примере показано, когда sql:datatype должен быть указан в схеме.