Использование XML с типами данных time, date, datetime2 и datetimeoffset
В существующем документе схемы XML sqltypes.xsd описываются типы схемы W3C XML, которые используются для определения типов данных SQL Server для FOR XML и HTTP/SOAP.
Документ схемы sqltypes.xsd
В 2004 пространство имен схемы XML было расширено путем включения следующих типов данных SQL Server: time, date, datetime2 и datetimeoffset.
.NET Framework System.Data.SqlDbType
В SqlDbTypeEnum были добавлены следующие перечисления.
Тип SQL Server |
.NET Framework SqlDbType |
---|---|
date |
Date |
time |
Time |
datetime2 |
LargeDateTime |
datetimeoffset |
DateTimeWithTimeZone |
Полная форма SqlDbTypeEnum следующая:
<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>
Описание и сопоставление типов данных даты и времени SQL Server
В следующей таблице перечисляются определения схем для типов данных даты и времени, которые были добавлены в SQL Server 2008.
Тип данных |
Определение схемы |
---|---|
datetime |
|
smalldatetime |
|
date |
|
time |
|
datetime2 |
|
datetimeoffset |
|
Системные каталоги пространства имен XML-схемы
Новые сведения о типе даты и времени, которые были добавлены в существующее пространство имен XML-схемы 2004, вносятся в следующие системные каталоги для XML-схемы. Эти сведения можно получить, выполнив запрос к данным каталогам.
Sys.xml_schemla_namespaces
Sys.xml_schema_collections
Sys.xml_schema_components
Метод XML value()
Метод XML value() предоставляет возможность обозначить тип данных SQL Server извлекаемого значения. Это подразумевает преобразование значения XSD в значение SQL Server для указанного типа. Типы даты и времени SQL Server поддерживаются для следующих приведений.
Любой экземпляр значения XQuery, представляющий дату, может быть приведен к типу date, datetime, smalldatetime, datetime2, datetimeoffset или к любому символьному типу в SQL Server.
Любой экземпляр значения XQuery, представляющий время, может быть приведен к типу time, datetime, smalldatetime, datetime2, datetimeoffset или к любому символьному типу в SQL Server.
Любой экземпляр значения XQuery, представляющий дату со временем без часового пояса, может быть приведен к типу datetime, smalldatetime, datetimeoffet (с нулевым смещением часового пояса), date (с удаленным компонентом времени), time (с удаленным компонентом даты), datetime2 или к любому символьному типу в SQL Server.
Любой экземпляр значения XQuery, представляющий дату со временем, имеющую признак часового пояса Z или смещение часового пояса (+|-чч:мм), может быть приведен к типу datetime (время в формате UTC без смещения часового пояса), smalldatetime (время в формате UTC без смещения часового пояса), datetimeoffet, date (без компонентов времени и смещения), datetime2 (время в формате UTC без смещения часового пояса), time (без компонентов даты и смещения) или к любому символьному типу в SQL Server.
Если приведение вызывает переполнение или выходит за диапазон допустимых значений, выводится сообщение об ошибке.
Если значение даты, времени или даты со временем (при наличии и отсутствии часового пояса) имеет точность (в долях секунды) большую, чем у целевого типа, значения с большей точностью долей секунды будут округляться.
Формат даты любого экземпляра XML-значения, представляющего тип данных date, определяется настройками SET LANGUAGE и SET DATEFORMAT.
Пример
В следующем примере используется метод 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
Псевдофункции XQuery
Функции sql:column() и sql:variable() распознают типы данных date, time, datetime2 и datetimeoffset.
Сопоставления типов SQL Server и типу XSD
Для псевдофункций sql:variable() и sql:column() базовый тип Xquery значения Xquery, которое было преобразовано из значения SQL Server, определяется семантикой сопоставления типов SQL Server типу XSD. Эта семантика сопоставления определена в расширенном пространстве имен XML-схемы.
Тип SQL Server |
Тип XSD |
---|---|
date |
xsd:date |
time |
xsd:time |
datetime2 |
xsd:datetime |
datetimeoffset |
xsd:datetime |
Сопоставление типов форматов хранения XML
В SQL Server 2008 формат хранения экземпляров XML типов даты и времени изменился, поскольку были добавлены новые типы даты и времени SQL Server. Следующая таблица отображает сопоставление типов данных XSD и SQL Server. Это сопоставление также определяет семантику операций между возвращаемыми результатами псевдофункций sql:column() и sql:variable() и экземплярами даты и времени XML.
Тип XSD |
Сопоставление типов форматов хранения XML и SQL Server с часовым поясом |
Сопоставление типов форматов хранения XML и SQL Server без часового пояса |
---|---|---|
xs:date |
datetimeoffset |
date |
xs:time |
datetimeoffset |
datetimeoffset |
xs:dateTime |
datetimeoffset |
datetime2 |
Предложения FOR XML и XMLSCHEMA
Столбцы SQL Server, объявленные типами данных date, time, datetime2 и datetimeoffset, поддерживаются в том случае, если в инструкции SELECT было указано предложение FOR XML или XMLSCHEMA.
Формат выходных данных
В следующей таблице перечисляются форматы выходных данных FOR XML для типов данных date, time, datetime2 и datetimeoffset.
Тип SQL Server |
Выходной формат FOR XML |
---|---|
date |
ГГГГ-ММ-ДД |
time |
чч:мм:сс[.ннннннн] |
datetime2 |
ГГГГ-ММ-ДДТчч:мм:сс[.nnnnnnn] |
datetimeoffset |
ГГГГ-ММ-ДДТчч:мм:сс[.ннннннн] [+|-]чч:мм |
Пример
В следующем примере типы date, time и datetimeoffset используются совместно с предложением 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"/>
Встроенная схема XSD с предложением XMLSCHEMA
Если предложение XMLSCHEMA применяется с предложением FOR XML, формируемая встроенная схема XSD будет следовать тем методам ограничения шаблона, которые были определены для каждого нового типа даты и времени в расширенном пространстве имен XML-схемы.
Функция OPENXML ()
В следующей таблице перечисляются форматы входных данных OPENXML для типов данных date, time, datetime2 и datetimeoffset.
Тип SQL Server |
Выходной формат FOR XML |
---|---|
date |
ГГГГ-ММ-ДД |
time |
чч:мм:сс[.ннннннн] |
datetime2 |
ГГГГ-ММ-ДДТчч:мм:сс[.nnnnnnn] |
datetimeoffset |
ГГГГ-ММ-ДДТчч:мм:сс[.ннннннн] [+|-]чч:мм |
Примеры
В следующем примере тип datetimeoffset используется с предложением OPENXML.
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