Coercizioni dei tipi di dati e annotazione sql:datatype (SQLXML 4.0)

In uno schema XDR l'attributo xsd:type specifica il tipo di dati XSD di un elemento o di un attributo. Quando viene utilizzato uno schema XSD per estrarre dati dal database, il tipo di dati specificato viene utilizzato per formattare i dati.

Oltre a specificare un tipo XSD in uno schema, è inoltre possibile specificare un tipo di dati di Microsoft SQL Server utilizzando l'annotazione sql:datatype. Le annotazioni xsd:type e sql:datatype controllano il mapping tra i tipi di dati XSD e i tipi di dati di Microsoft SQL Server.

Attributo xsd:type

È possibile utilizzare l'attributo xsd:type per specificare il tipo di dati XML di un attributo o di un elemento con mapping a una colonna. xsd:type influisce sul documento restituito dal server nonché sulla query XPath eseguita. Quando viene eseguita una query XPath su uno schema di mapping contenente xsd:type, XPath utilizza il tipo di dati specificato durante l'elaborazione della query. Per ulteriori informazioni sull'utilizzo di xsd:type da parte di XPath, vedere Mapping dei tipi di dati XSD ai tipi di dati XPath (SQLXML 4.0).

In un documento restituito tutti i tipi di dati di SQL Server vengono convertiti in rappresentazioni di stringa. Alcuni tipi di dati richiedono conversioni aggiuntive. Nella tabella seguente sono elencate le conversioni utilizzate per i diversi valori di xsd:type.

Tipo di dati XSD

Conversione 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)

Tutti gli altri

Nessuna conversione aggiuntiva

[!NOTA]

Alcuni dei valori restituiti da SQL Server potrebbero non essere compatibili con i tipi di dati XML specificati tramite xsd:type, in quanto la conversione non è possibile (ad esempio, la conversione di "XYZ" in un tipo di dati decimal ) o perché il valore supera l'intervallo del tipo di dati (ad esempio, la conversione di -100000 in un tipo XSD UnsignedShort). Conversioni di tipi incompatibili possono restituire documenti XML non validi o errori di SQL Server.

Mapping dai tipi di dati di SQL Server a tipi di dati XSD

Nella tabella seguente viene illustrato un mapping evidente dai tipi di dati di SQL Server ai tipi di dati XSD. Se il tipo di SQL Server è noto, nella tabella è disponibile il tipo XSD corrispondente che è possibile specificare nello schema XSD.

Tipo di dati di SQL Server

Tipo di dati 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

Annotazione sql:datatype

L'annotazione sql:datatype viene utilizzata per indicare il tipo di dati di SQL Server e deve essere specificata nei casi seguenti:

  • Se si esegue il caricamento bulk in una colonna dateTime di SQL Server da un tipo XSD dateTime, date o time. In questo caso, è necessario identificare il tipo di dati della colonna di SQL Server utilizzando sql:datatype="dateTime". Questa regola si applica anche agli updategram.

  • Se si esegue un caricamento bulk in una colonna di tipo uniqueidentifier di SQL Server e il valore XSD è un GUID che include parentesi graffe ({ e }). Quando si specifica sql:datatype="uniqueidentifier", le parentesi graffe vengono rimosse dal valore prima che questo venga inserito nella colonna. Se non si specifica sql:datatype, il valore viene inviato con le parentesi graffe e l'inserimento o l'aggiornamento non viene eseguito.

  • Viene eseguito il mapping del tipo di dati XML base64Binary a diversi tipi di dati di SQL Server (binary, image o varbinary). Per eseguire il mapping del tipo di dati XML base64Binary a un tipo di dati di SQL Server specifico, utilizzare l'annotazione sql:datatype. Questa annotazione specifica il tipo di dati esplicito di SQL Server della colonna a cui viene mappato l'attributo. Ciò risulta utile durante l'archiviazione dei dati nei database. Specificando l'annotazione sql:datatype, è possibile identificare il tipo di dati esplicito di SQL Server.

È in genere consigliabile specificare sql:datatype nello schema.

Esempi

Per creare esempi reali utilizzando gli esempi seguenti, è necessario soddisfare alcuni requisiti. Per ulteriori informazioni, vedere Requisiti per l'esecuzione di esempi di SQLXML.

A.Definizione dell'attributo xsd:type

In questo esempio viene illustrato il modo in cui un tipo XSD date specificato tramite l'attributo xsd:type nello schema influisce sul documento XML risultante. Lo schema fornisce una vista XML della tabella Sales.SalesOrderHeader nel database 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>

In questo schema XSD sono inclusi tre attributi che restituiscono un valore di data da SQL Server. Esaminare i casi seguenti per lo schema:

  • Se lo schema specifica xsd:type=date nell'attributo OrderDate, viene visualizzata la parte relativa alla data del valore restituito da SQL Server per l'attributo OrderDate.

  • Se lo schema specifica xsd:type=time nell'attributo ShipDate, viene visualizzata la parte relativa all'ora del valore restituito da SQL Server per l'attributo ShipDate.

  • Se lo schema non specifica xsd:type nell'attributo DueDate, viene visualizzato lo stesso valore restituito da SQL Server.

Per testare una query Xpath di esempio sullo schema

  1. Copiare il codice dello schema precedente e incollarlo in un file di testo. Salvare il file con il nome xsdType.xml.

  2. Copiare il modello seguente e incollarlo in un file di testo. Salvare il file con il nome xsdTypeT.xml nella stessa directory in cui è stato salvato xsdType.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="xsdType.xml">
        /Order
      </sql:xpath-query>
    </ROOT>
    

    Il percorso di directory specificato per lo schema di mapping (xsdType.xml) è relativo alla directory in cui è salvato il modello. È possibile specificare anche un percorso assoluto, ad esempio:

    mapping-schema="C:\SqlXmlTest\xsdType.xml"
    
  3. Creare e utilizzare lo script di test SQLXML 4.0 (Sqlxml4test.vbs) per eseguire il modello.

    Per ulteriori informazioni, vedere Utilizzo di ADO per eseguire query SQLXML 4.0.

Di seguito è riportato il set di risultati parziale:

<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>

Di seguito viene indicato lo schema XDR equivalente:

<?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.Definizione del tipo di dati SQL tramite sql:datatype

Per un esempio reale, vedere l'esempio G in Esempi di caricamento bulk XML (SQLXML 4.0). In questo esempio viene eseguito il caricamento bulk di un valore GUID che include"{" e "}". Lo schema in questo esempio specifica sql:datatype per identificare il tipo di dati di SQL Server come uniqueidentifier. In questo esempio vengono indicati i casi in cui è necessario specificare sql:datatype nello schema.