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

Si applica a: SQL Server Azure SQL Database

In uno schema XSD 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, è anche possibile specificare un tipo di dati Microsoft SQL Server usando l'annotazione sql:datatype. Gli attributi xsd:type e sql:datatype controllano il mapping tra tipi di dati XSD e SQL Server tipi di dati.

Attributo xsd:type

È possibile usare l'attributo xsd:type per specificare il tipo di dati XML di un attributo o di un elemento che esegue il mapping a una colonna. Il tipo xsd:type influisce sul documento restituito dal server e anche sulla query XPath eseguita. Quando una query XPath viene eseguita su uno schema di mapping contenente xsd:type, XPath usa il tipo di dati specificato quando elabora la query. Per altre informazioni su come XPath usa xsd:type, vedere Mapping dei tipi di dati XSD ai 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 conversioni aggiuntive. Nella tabella seguente sono elencate le conversioni usate per vari valori xsd:type .

Tipo di dati XSD Conversione SQL Server
Boolean CONVERT(bit, COLUMN)
Data 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)
Ora 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 usando xsd:type, poiché la conversione non è possibile (ad esempio, convertire "XYZ" in un tipo di dati decimale) o perché il valore supera l'intervallo di tale tipo di dati (ad esempio -100000 convertito in un tipo XSD UnsignedShort). Le conversioni di tipi incompatibili potrebbero causare documenti XML non validi o in SQL Server errori.

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

Nella tabella seguente viene illustrato un mapping ovvio dai tipi di dati SQL Server ai tipi di dati XSD. Se si conosce il tipo di SQL Server, questa tabella fornisce 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 usata per specificare il tipo di dati SQL Server; questa annotazione deve essere specificata quando:

  • Si esegue il caricamento bulk in una colonna dateTime SQL Server da un tipo di datatime, data o ora XSD. In questo caso, è necessario identificare il tipo di dati di colonna SQL Server usando sql:datatype="dateTime". Questa regola si applica anche agli updategram.

  • Si sta caricando in blocco in una colonna di SQL Server tipo uniqueidentifier 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 venga inserito nella colonna. Se sql:datatype non è specificato, il valore viene inviato con le parentesi graffe e l'inserimento o l'aggiornamento ha esito negativo.

  • Il tipo di dati XML base64Binary esegue il mapping a vari tipi di dati SQL Server (binario, immagine o varbinary). Per eseguire il mapping del tipo di dati XML base64Binary a un tipo di dati SQL Server specifico, usare l'annotazione sql:datatype. Questa annotazione specifica il tipo di dati esplicito SQL Server della colonna a cui viene eseguito il mapping dell'attributo. Ciò risulta utile durante l'archiviazione dei dati nei database. Specificando l'annotazione sql:datatype, è possibile identificare il tipo di dati esplicito SQL Server.

È generalmente consigliabile specificare sql:datatype nello schema.

Esempi

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

A. Definizione dell'attributo xsd:type

In questo esempio viene illustrato come un tipo di data XSD specificato usando 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 disponibili tre attributi che restituiscono un valore di data da SQL Server. Esaminare i casi seguenti per lo schema:

  • Specifica xsd:type=date nell'attributo OrderDate, viene visualizzata la parte data del valore restituito da SQL Server per l'attributo OrderDate.

  • Specifica xsd:type=time nell'attributo ShipDate, viene visualizzata la parte temporale del valore restituito da SQL Server per l'attributo ShipDate.

  • 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 altre informazioni, vedere Uso 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 funzionante, vedere Esempio G negli 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 SQL Server come uniqueidentifier. Questo esempio illustra quando sql:datatype deve essere specificato nello schema.