Condividi tramite


Coercizioni dei tipi di dati (schema XDR)

Nota importanteImportante

Questo argomento viene incluso come riferimento per le applicazioni legacy. Per questa funzionalità non è previsto alcun progetto di sviluppo in futuro. Evitare di utilizzarla in un nuovo progetto di sviluppo. Utilizzare invece gli schemi XSD con annotazioni per creare le viste XML. Per ulteriori informazioni, vedere Introduzione agli schemi XSD con annotazioni (SQLXML 4.0). È possibile convertire gli schemi XDR con annotazioni esistenti in schemi XSD. Per ulteriori informazioni, vedere Conversione di schemi XDR con annotazioni in schemi XSD equivalenti (SQLXML 4.0).

In uno schema XDR è possibile specificare il tipo di dati di un elemento o di un attributo. Quando uno schema XDR viene utilizzato per estrarre i dati dal database, viene restituito il formato appropriato dei dati come risultato di una query. Le annotazioni dt:type e sql:datatype vengono utilizzate per controllare il mapping tra i tipi di dati XDR e i tipi di dati Microsoft SQL Server.

dt:type

È possibile utilizzare l'attributo dt:type per specificare il tipo di dati XML di un attributo o di un elemento che viene mappato a una colonna. L'attributo dt:type può essere specificato in <AttributeType> o <ElementType>. dt:type influisce sul documento restituito dal server nonché sulla query XPath eseguita. Quando viene eseguita una query XPath su uno schema di mapping contenente dt:type, XPath utilizza il tipo di dati indicato durante l'elaborazione della query. Per ulteriori informazioni sul modo in cui XPath utilizza dt:type, vedere Tipi di dati XPath (SQLXML 4.0).

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

Tipo di dati XML

Conversione SQL Server

bit

CONVERT(bit, COLUMN)

date

LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10)

fixed.14.4

CONVERT(money, COLUMN)

id/idref/idrefs

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

nmtoken/nmtokens

id-prefix + CONVERT(nvarchar(4000), COLUMN, 126)

time/time.tz

SUBSTRING(CONVERT(nvarchar(4000), COLUMN, 126), 1+CHARINDEX(N'T', CONVERT(nvarchar(4000), COLUMN, 126)), 24)

Tutti gli altri

Nessuna conversione aggiuntiva

Notare che alcuni valori SQL Server non possono essere convertiti in alcuni tipi di dati XML, sia perché la conversione non è possibile, ad esempio "XYZ" convertito in un tipo di dati numerico, sia perché il valore supera l'intervallo di tale tipo di dati, ad esempio -100000 convertito in ui2. Se si eseguono conversioni di tipi non compatibili, si possono creare documenti XML non validi o generare errori di SQL Server.

Mapping dai tipi di dati SQL Server ai tipi di dati XML

Nella tabella viene illustrato un mapping standard dai tipi di dati SQL Server ai tipi di dati XML.

Tipo di dati SQL Server

Tipo di dati XML

bigint

i8

binary

bin.base64

bit

boolean

char

char

datetime

datetime

decimal

r8

float

r8

image

bin.base64

int

int

money

r8

nchar

string

ntext

string

nvarchar

string

numeric

r8

real

r4

smalldatetime

datetime

smallint

i2

smallmoney

fixed.14.4

sysname

string

text

string

timestamp

ui8

tinyint

ui1

varbinary

bin.base64

varchar

string

uniqueidentifier

uuid

sql:datatype

Il tipo di dati XML bin.base64 viene mappato a diversi tipi di dati Microsoft SQL Server (binary, image, varbinary). Per mappare in modo chiaro il tipo di dati XML bin.base64 a un tipo di dati SQL Server specifico, viene utilizzata l'annotazione sql:datatype. sql:datatype specifica il tipo di dati SQL Server della colonna a cui viene mappato l'attributo.

Ciò risulta utile durante l'archiviazione dei dati nel database. Specificando l'annotazione sql:datatype, è possibile identificare il tipo di dati SQL Server esplicito. L'elemento di dati viene quindi archiviato come il tipo specificato in sql:datatype.

L'annotazione sql:datatype supporta tutti i tipi di dati SQL Server predefiniti. I tipi di dati definiti dall'utente o i sinonimi non sono supportati. Sono inoltre supportati precisione e scala, ad esempio, sql:datatype="nvarchar"and sql:datatype="nchar(10)".

Se si specificano i tipi di dati XDR e SQL Server nello schema di mapping, è possibile evitare le conversioni di dati non necessarie nelle query SQL. Ad esempio, XPath deve convertire dal tipo di dati SQL Server al tipo di dati XDR, quindi dal tipo XDR al tipo XPath. Se si specifica sql:datatype o il tipo XDR e XPath determina che la conversione non è necessaria, questa non viene eseguita.

Nel caso di colonne chiave primaria, l'eliminazione di tali conversioni può produrre un miglioramento significativo delle prestazioni. Ad esempio, la query seguente richiede generalmente una conversione di CustomerID in una stringa (nvarchar) per garantire risultati corretti:

Customer[@CustomerID='ALFKI']

Se CustomerID viene annotato nello schema con sql:datatype="nvarchar", XPath può evitare di eseguire la conversione di dati non necessaria.

Esempi

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

A. Specificare dt:type in un attributo

In questo schema XDR dt:type viene specificato negli attributi OrdDate e ShipDate.

Per l'attributo ReqDate non viene specificato alcun tipo di dati XPath. Pertanto, XPath restituisce i valori datetime di SQL Server recuperati dalla colonna RequiredDate nel database.

Il tipo di dati XPath "date" viene specificato nell'attributo OrdDate. XPath restituisce solo la parte relativa alla data dei valori (e non l'ora) recuperata dalla colonna OrderDate.

Il tipo di dati XPath "time" viene specificato nell'attributo ShipDate. XPath restituisce solo la parte relativa all'ora dei valori (e non la data) recuperata dalla colonna ShippedDate.

<?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="Orders">
    <AttributeType name="OID" />
    <AttributeType name="CustID"  />
    <AttributeType name="OrdDate" dt:type="date" />
    <AttributeType name="ReqDate" />
    <AttributeType name="ShipDate" dt:type="time" />

    <attribute type="OID" sql:field="OrderID" />
    <attribute type="CustID" sql:field="CustomerID" />
    <attribute type="OrdDate" sql:field="OrderDate" />
    <attribute type="ReqDate" sql:field="RequiredDate" />
    <attribute type="ShipDate" sql:field="ShippedDate" />
</ElementType>
</Schema>

Per testare una query Xpath di esempio sullo schema

  1. Copiare il codice dello schema sopra riportato e incollarlo in un file di testo. Salvare il file con il nome dataTypeXdr.xml.

  2. Copiare il modello seguente e incollarlo in un file di testo. Salvare il file con il nome dataTypeXdrT.xml nella stessa directory nella quale è stato salvato dataTypeXdr.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="dataTypeXdr.xml">
        /Order[@OID=43860]
      </sql:xpath-query>
    </ROOT>
    
  3. Questo URL esegue il modello:

    http://IISServer/AdventureWorks/template/dataTypeXdrT.xml
    

Set di risultati:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
  <Order OID="43860" CustID="1" OrdDate="2001-08-01" ReqDate="2001-08-13T00:00:00" ShipDate="00:00:00" /> 
</ROOT>

B. Specificare sql:datatype in un attributo

In questo esempio sql:datatype viene utilizzato per identificare il tipo di dati SQL Server della colonna LargePhoto.

<?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="ProductPhoto" sql:relation="Production.ProductPhoto">
    <AttributeType name="PhotoID" />
    <AttributeType name="filename" />
    <AttributeType name="photo" sql:datatype="image"  />

    <attribute type="PhotoID" sql:field="ProductPhotoID" />
    <attribute type="filename" sql:field="LargePhotoFileName" />
    <attribute type="photo" sql:field="LargePhoto" />
</ElementType>
</Schema>

Per testare una query Xpath di esempio sullo schema

  1. Copiare il codice dello schema sopra riportato e incollarlo in un file di testo. Salvare il file con il nome DataTypeXdr2.xml.

  2. Copiare il modello seguente e incollarlo in un file di testo. Salvare il file con il nome DataTypeXdr2T.xml nella stessa directory nella quale è stato salvato DataTypeXdr2.xml.

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
      <sql:xpath-query mapping-schema="DataTypeXdr2.xml">
        /ProductPhoto[@PhotoID="100"]
      </sql:xpath-query>
    </ROOT>
    

    Il percorso della directory specificato per lo schema di mapping (DataTypeXdr2.xml) è relativo alla directory nella quale viene salvato il modello. È possibile specificare anche un percorso assoluto, ad esempio:

    mapping-schema="C:\MyDir\DataTypeXdr2.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.

Set di risultati:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> 
    <ProductPhoto PhotoID="100" filename="racer02_red_large.gif" 
 photo="Binary_base64_image_returned_here"/> 
</ROOT>

Vedere anche

Riferimento