Utilizzo del codice XML con i tipi di dati time, date, datetime2 e datetimeoffset
Nel documento di schema XML esistente sqltypes.xsd vengono illustrati i tipi di schema XML W3C utilizzati per descrivere i tipi di dati di SQL Server in FOR XML e HTTP/SOAP.
Documento dello schema sqltypes.xsd
Lo spazio dei nomi dello schema XML del 2004 è stato esteso per includere i tipi di dati di SQL Server, ovvero time, date, datetime2 e datetimeoffset.
System.Data.SqlDbType .NET Framework
A SqlDbTypeEnum sono state aggiunte le enumerazioni seguenti:
Tipo SQL Server |
.SqlDbType .NET Framework |
---|---|
date |
Date |
time |
Time |
datetime2 |
LargeDateTime |
datetimeoffset |
DateTimeWithTimeZone |
L'enumerazione SqlDbTypeEnum completa è la seguente:
<xsd:simpleType name="sqlDbTypeEnum">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="BigInt" />
<xsd:enumeration value="Binary" />
<xsd:enumeration value="Bit" />
<xsd:enumeration value="Char" />
<xsd:enumeration value="Date" />
<xsd:enumeration value="DateTime" />
<xsd:enumeration value="DateTimeWithTimeZone" />
<xsd:enumeration value="Decimal" />
<xsd:enumeration value="Float" />
<xsd:enumeration value="Image" />
<xsd:enumeration value="Int" />
<xsd:enumeration value="LargeDateTime" />
<xsd:enumeration value="Money" />
<xsd:enumeration value="NChar" />
<xsd:enumeration value="NText" />
<xsd:enumeration value="NVarChar" />
<xsd:enumeration value="Real" />
<xsd:enumeration value="SmallDateTime" />
<xsd:enumeration value="SmallInt" />
<xsd:enumeration value="SmallMoney" />
<xsd:enumeration value="Text" />
<xsd:enumeration value="Time" />
<xsd:enumeration value="Timestamp" />
<xsd:enumeration value="TinyInt" />
<xsd:enumeration value="Udt" />
<xsd:enumeration value="UniqueIdentifier" />
<xsd:enumeration value="VarBinary" />
<xsd:enumeration value="VarChar" />
<xsd:enumeration value="Variant" />
<xsd:enumeration value="Xml" />
</xsd:restriction>
</xsd:simpleType>
Descrizione e mapping dei tipi di dati date e time di SQL Server
Nella tabella seguente vengono elencate le definizioni dello schema per i tipi di dati date e time introdotti in SQL Server 2008.
Tipo di dati |
Definizione dello schema |
---|---|
datetime |
|
smalldatetime |
|
date |
|
time |
|
datetime2 |
|
datetimeoffset |
|
Cataloghi di sistema dello spazio dei nomi dello schema XML
Le informazioni sui nuovi tipi time e date aggiunti allo spazio dei nomi dello schema XML del 2004 esistente vengono archiviate e possono essere oggetto di query dai seguenti cataloghi di sistema specifici dello schema XML:
Sys.xml_schemla_namespaces
Sys.xml_schema_collections
Sys.xml_schema_components
Metodo value() XML
Il metodo value() XML consente di indicare il tipo di dati di SQL Server del valore estratto. Questo implica una conversione dal valore XSD a un valore di SQL Server per il tipo specificato. I tipi date e time di SQL Server sono supportati per l'esecuzione dei seguenti cast:
È possibile eseguire il cast di qualsiasi istanza del valore XQuery che rappresenta una data in un tipo di dati date, datetime, smalldatetime, datetime2, datetimeoffset oppure in qualsiasi tipo di carattere di SQL Server.
È possibile eseguire il cast di qualsiasi istanza del valore XQuery che rappresenta un'ora in un tipo di dati time, datetime, smalldatetime, datetime2, datetimeoffset oppure in qualsiasi tipo di carattere di SQL Server.
È possibile eseguire il cast di qualsiasi istanza del valore XQuery che rappresenta una data con un'ora senza fuso orario in un tipo di dati datetime, smalldatetime, datetimeoffet (con differenza di fuso orario pari a 0), date (parte relativa all'ora eliminata), time (parte relativa alla data eliminata), datetime2, oppure in qualsiasi tipo di carattere di SQL Server.
È possibile eseguire il cast di qualsiasi istanza del valore XQuery che rappresenta una data con un'ora con indicatore Z o differenza di fuso orario (+|-hh:mm) in un tipo di dati datetime (ora UTC senza differenza di fuso orario), smalldatetime (ora UTC senza differenza di fuso orario), datetimeoffet, date (parte relativa all'ora e differenza di fuso orario eliminate), datetime2 (ora UTC senza differenza di fuso orario), time (parte relativa alla data e differenza di fuso orario eliminate) oppure in qualsiasi tipo di carattere di SQL Server.
Se l'esecuzione del cast provoca un overflow o una condizione di valori non compresi nell'intervallo valido, verrà restituito un messaggio di errore.
Se una data, un'ora o una data con il valore dell'ora (con o senza fuso orario) è caratterizzata da maggiore precisione (secondi frazionari) rispetto al tipo di destinazione, la precisione più elevata determinata dai secondi frazionari verrà arrotondata.
Il formato della data di qualsiasi istanza del valore XML che rappresenta un tipo di dati date viene determinato dalle impostazioni SET LANGUAGE e SET DATEFORMAT.
Esempio
Nell'esempio seguente viene utilizzato il metodo value().
DECLARE @myDoc xml;
DECLARE @OrderID int;
DECLARE @OrderDate date;
DECLARE @OrderTime time;
DECLARE @OrderDateTime datetimeoffset;
SET @myDoc = '<Root>
<OrderDescription OrderID="1" OrderDate="1999-12-20" OrderTime="13:40:58.47786" OrderDateTime="1999-12-20 13:40:58.123-05:00">
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</OrderDescription>
</Root>';
SET @OrderID = @myDoc.value('(/Root/OrderDescription/@OrderID)[1]', 'int');
SET @OrderDate = @myDoc.value('(/Root/OrderDescription/@OrderDate)[1]', 'date');
SET @OrderTime = @myDoc.value('(/Root/OrderDescription/@OrderTime)[1]', 'time');
SET @OrderDateTime = @myDoc.value('(/Root/OrderDescription/@OrderDateTime)[1]', 'datetimeoffset');
SELECT @OrderID,@OrderDate,@OrderTime,@OrderDateTime;
--Returns: 1 1999-12-20 13:40:58.4778600 1999-12-20 13:40:58.1230000 -0
Pseudofunzioni XQuery
sql:column() e sql:variable() riconoscono i tipi di dati date, time, datetime2 e datetimeoffset.
Mapping dei tipi SQL Server ai tipi XSD
Per sql:variable() e sql:column(), il tipo di base Xquery del valore Xquery trasformato dal valore di SQL Server viene determinato dalla semantica del mapping dal tipo SQL Server al tipo XSD. Tale semantica viene definita nello spazio dei nomi dello schema XML esteso.
Tipo SQL Server |
Tipo XSD |
---|---|
date |
xsd:date |
time |
xsd:time |
datetime2 |
xsd:datetime |
datetimeoffset |
xsd:datetime |
Mapping dei tipi del formato di archiviazione XML
In SQL Server 2008 il formato di archiviazione per l'istanza XML dei tipi date e time è stato modificato mediante l'utilizzo dei nuovi tipi date e time di SQL Server. Nella tabella seguente viene illustrato il mapping tra i tipi di dati XSD e SQL Server. Tale mapping determinerà anche la semantica dell'operazione tra i risultati restituiti da sql:column() e sql:variable() e le istanze relative ai tipi date e time XML.
Tipo XSD |
Mapping dei tipi SQL Server del formato di archiviazione con fuso orario |
Mapping dei tipi SQL Server del formato di archiviazione senza fuso orario |
---|---|---|
xs:date |
datetimeoffset |
date |
xs:time |
datetimeoffset |
datetimeoffset |
xs:dateTime |
datetimeoffset |
datetime2 |
Clausole FOR XML e XMLSCHEMA
Quando la clausola FOR XML o XMLSCHEMA è specificata nell'istruzione SELECT, sono supportate colonne di SQL Server dichiarate dai tipi di dati date, time, datetime2 e datetimeoffset.
Formato di output
Nella tabella seguente vengono elencati i formati di output FOR XML per i tipi di dati date, time, datetime2 e datetimeoffset.
Tipo SQL Server |
Formato di output FOR XML |
---|---|
date |
YYYY-MM-DD |
time |
hh:mm:ss[.nnnnnnn] |
datetime2 |
YYYY-MM-DDThh:mm:ss[.nnnnnnn] |
datetimeoffset |
YYYY-MM-DDThh:mm:ss[.nnnnnnn] [+|-]hh:mm |
Esempio
Nell'esempio seguente vengono utilizzati i tipi date, time e datetimeoffset con FOR XML.
CREATE TABLE T1
(
dt date, tm time, dtz datetimeoffset
);
GO
INSERT INTO T1
VALUES('1996-12-16', '12:30:47.7867', '1996-12-16 12:30:47.7867-05:00');
SELECT dt FROM T1 FOR XML AUTO;
--Returns:
--XML_F52E2B61-18A1-11d1-B105-00805F49916B
------------------------------------------
--<t1 dt="1996-12-16"/>
SELECT tm FROM T1 FOR XML AUTO;
--Returns:
--XML_F52E2B61-18A1-11d1-B105-00805F49916B
------------------------------------------
--<t1 tm="12:30:47.7867"/>
SELECT dtz FROM T1 FOR XML AUTO;
--Returns:
--XML_F52E2B61-18A1-11d1-B105-00805F49916B
------------------------------------------
--<t1 dtz="1996-12-16T12:30:47.7867 -05:00"/>
Schema inline XSD con la clausola XMLSCHEMA
Quando la clausola XMLSCHEMA viene applicata con la clausola FOR XML, lo schema inline XSD generato segue i metodi di restrizione dello schema definiti per ognuno dei nuovi tipi date e time nello spazio dei nomi dello schema XML esteso esistente.
Funzione OPENXML ()
Nella tabella seguente vengono elencati i formati di input OPENXML per i tipi di dati date, time, datetime2 e datetimeoffset.
Tipo SQL Server |
Formato di output FOR XML |
---|---|
date |
YYYY-MM-DD |
time |
hh:mm:ss[.nnnnnnn] |
datetime2 |
YYYY-MM-DDThh:mm:ss[.nnnnnnn] |
datetimeoffset |
YYYY-MM-DDThh:mm:ss[.nnnnnnn][+|-]hh:mm |
Esempio
Nell'esempio seguente viene utilizzato OPENXML con il tipo di dati datetimeoffset.
CREATE TABLE T1
(
dt date, tm time(7), dtz datetimeoffset(7)
)
GO
DECLARE @docHandle int;
DECLARE @xmlDocument nvarchar(max); -- or xml type
SET @xmlDocument = N'<ROOT>
<T1 dt="2000-08-25" tm="12:30:47.1234567" dtz="2000-08-25T05:22:36.1234567-05:00"/>
</ROOT>';
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument;
-- Use OPENXML to provide rowset that consists of customer data.
INSERT T1
SELECT *
FROM OPENXML(@docHandle, N'/ROOT/T1')
WITH T1;
-- Using OPENXML in a SELECT statement
SELECT * FROM OPENXML(@docHandle, N'/ROOT/T1') WITH (dt date , tm time, dtz datetimeoffset);
EXEC sp_xml_removedocument @docHandle