Condividi tramite


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

Si applica a: SQL Server database SQL di Azure

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 di Microsoft SQL Server usando l'annotazione sql:datatype . Gli attributi xsd:type e sql:datatype controllano il mapping tra i tipi di dati XSD e i tipi di dati di 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 mappato a una colonna. Xsd :type influisce sul documento restituito dal server e 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 di 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
Booleano CONVERT(bit, COLUMN)
Data LEFT(CONVERT(nvarchar(4000), COLUMN, 126), 10)
decimale 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, perché la conversione non è possibile (ad esempio, la conversione di "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 possono comportare documenti XML non validi o errori di SQL Server.

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

La tabella seguente illustra un mapping ovvio dai tipi di dati di 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
Immagine 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
Testo 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 di SQL Server. Questa annotazione deve essere specificata quando:

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

  • Si esegue il 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 di essere inserite nella colonna. Se sql:datatype non viene 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 di SQL Server (binary, image 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 di 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 sql Server esplicito.

È in genere 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.

R. Definizione dell'attributo xsd:type

In questo esempio viene illustrato come un tipo di data XSD specificato utilizzando 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 relativa alla 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 di SQL Server come uniqueidentifier. Questo esempio illustra quando è necessario specificare sql:datatype nello schema.