Поделиться через


Изменения в функции массового копирования для работы с улучшенными типами даты-времени (OLE DB и ODBC)

Описываются новые возможности даты-времени для поддержки операций массового копирования. Приведенные в данном разделе сведения верны как для OLE DB, так и для ODBC в собственном клиенте SQL Server.

Файлы форматирования

При интерактивном построении файлов форматирования следующая таблица описывает вводные данные для задания типов даты-времени и соответствующих имен типов данных из файлов размещения.

Тип файлового хранилища

Тип данных основного файла

Ответ на приглашение: \Введите тип хранения файлов для поля <имя_поля> [<значение_по_умолчанию>]:"

Datetime

SQLDATETIME

d

Smalldatetime

SQLDATETIM4

D

Date

SQLDATE

de

Time

SQLTIME

te

Datetime2

SQLDATETIME2

d2

Datetimeoffset

SQLDATETIMEOFFSET

do

XSD для XML-файла форматирования будет содержать следующие дополнительные данные:

    <xs:complexType name="SQLDATETIME2">        <xs:complexContent>            <xs:extension base="bl:Fixed"/>        </xs:complexContent>    </xs:complexType>    <xs:complexType name="SQLDATETIMEOFFSET">        <xs:complexContent>            <xs:extension base="bl:Fixed"/>        </xs:complexContent>    </xs:complexType>    <xs:complexType name="SQLDATE">        <xs:complexContent>            <xs:extension base="bl:Fixed"/>        </xs:complexContent>    </xs:complexType>    <xs:complexType name="SQLTIME">        <xs:complexContent>            <xs:extension base="bl:Fixed"/>        </xs:complexContent>    </xs:complexType>

Файлы символьных данных

В файлах символьных данных значения даты-времени представлены в соответствии с документом «Форматы данных: Строки и литералы» раздела Поддержка типов данных для улучшений типов даты-времени ODBC для ODBC и раздела Улучшения поддержки типов данных даты-времени OLE DB для OLE DB.

В файлах данных в собственном формате значения даты и времени четырех новых типов представлены в виде TDS с масштабом 7 (поскольку это максимальное значение, поддерживаемое в SQL Server, а файлы данных bcp не хранят масштаб для этих столбцов). В хранении существующих типов datetime и smalldatetime, а также их представлений в виде потоков табличных данных (TDS) изменений нет.

Размеры типов OLE DB для различных типов хранилища следующие:

Тип файлового хранилища

Объем памяти в байтах

datetime

8

smalldatetime

4

date

3

time

6

datetime2

9

datetimeoffset

11

Размеры для ODBC указаны ниже. Следует заметить, что хранить данные о точности в любом из форматов и в файлах данных не обязательно, поскольку BCP.exe всегда запрашивает значение точности на сервере.

Тип файлового хранилища

Объем памяти в байтах

Формат хранения

datetime (d)

8

TDS

smalldatetime (D)

4

TDS

date (de)

3

TDS

time (te)

6

TDS

datetime2 (d2)

9

TDS

datetimeoffset (do)

11

TDS

Типы BCP в sqlncli.h

В файле sqlncli.h определены следующие типы, используемые в расширениях API-интерфейсов BCP для ODBC. Эти типы передаются с параметром eUserDataType метода IBCPSession::BCPColFmt в OLE DB.

Тип файлового хранилища

Тип данных основного файла

Тип в файле sqlncli.h для использования с IBCPSession::BCPColFmt).

Значение

Datetime

SQLDATETIME

BCP_TYPE_SQLDATETIME

0x3d

Smalldatetime

SQLDATETIM4

BCP_TYPE_SQLDATETIME4

0x3a

Date

SQLDATE

BCP_TYPE_SQLDATE

0x28

Time

SQLTIME

BCP_TYPE_SQLTIME

0x29

Datetime2

SQLDATETIME2

BCP_TYPE_SQLDATETIME2

0x2a

Datetimeoffset

SQLDATETIMEOFFSET

BCP_TYPE_SQLDATETIMEOFFSET

0x2b

Поддерживаемые преобразования типов данных BCP

Сведения о преобразованиях приведены в следующих таблицах.

OLE DB Примечание   Следующие преобразования выполняются через интерфейс IBCPSession. Интерфейс IRowsetFastLoad использует преобразования OLE DB, как описано в документе Преобразования, выполняемые при передаче от клиента к серверу. Следует заметить, что значения даты-времени округляются до 1/300 секунды, а в значениях типа smalldatetime после выполнения клиентских преобразований, описанных ниже, значение секунд становится равным нулю. Округление даты-времени распространяется на часы и минуты, но не на дату.

           К -->

Из

date

time

smalldatetime

datetime

datetime2

datetimeoffset

char

wchar

Date

1

-

1,6

1,6

1,6

1,5,6

1,3

1,3

Time

Недоступно

1,10

1,7,10

1,7,10

1,7,10

1,5,7,10

1,3

1,3

Smalldatetime

1,2

1,4,10

1

1

1,10

1,5,10

1,11

1,11

Datetime

1,2

1,4,10

1,12

1

1,10

1,5,10

1,11

1,11

Datetime2

1,2

1,4,10

1,10 (ODBC)1,12 (OLE DB)

1,10

1,10

1,5,10

1,3

1,3

Datetimeoffset

1,2,8

1,4,8,10

1,8,10

1,8,10

1,8,10

1,10

1,3

1,3

Char/wchar (date)

9

-

9,6 (ODBC)9,6,12 (OLE DB)

9,6 (ODBC)9,6,12 (OLE DB)

9,6

9,5,6

Недоступно

Недоступно

Char/wchar (time)

-

9,10

9,7,10 (ODBC)9,7,10,12 (OLE DB)

9,7,10 (ODBC)9,7,10, 12 (OLE DB)

9,7,10

9,5,7,10

Недоступно

Недоступно

Char/wchar (datetime)

9,2

9,4,10

9,10 (ODBC)9,10,12 (OLE DB)

9,10 (ODBC)9,10,12 (OLE DB)

9,10

9,5,10

Недоступно

Недоступно

Char/wchar (datetimeoffset)

9,2,8

9,4,8,10

9,8,10 (ODBC)9,8,10,12 (OLE DB)

9,8,10 (ODBC)9,8,10,12 (OLE DB)

9,8,10

9,10

Недоступно

Недоступно

Расшифровка символов

Знак

Смысл

-

Преобразование не поддерживается.

Создается запись диагностики ODBC с кодом SQLSTATE 07006 и сообщением «Нарушение атрибута ограниченного типа данных».

1

Если переданы недопустимые данные, то создается запись диагностики ODBC с кодом SQLSTATE 22007 и сообщением «Недопустимый формат даты-времени». Для значений типа datetimeoffset после преобразования в UTC временная часть должна находиться в пределах диапазона, даже если преобразование в UTC не требуется. Это требование вызвано тем, что TDS и сервер всегда нормализуют время в значениях типа datetimeoffset для UTC . Поэтому клиент должен проверить, что компоненты времени после преобразования в UTC попадают в поддерживаемый диапазон.

2

Компонент времени не учитывается.

3

Для ODBC, если происходит усечение с потерей данных, создается запись диагностики с кодом SQLSTATE 22001 и сообщением «Строковые данные, усечение справа». Количество разрядов для дробной секунды (масштаб) определяется размером целевого столбца согласно следующей таблице. Для размеров столбцов, превышающих диапазон в таблице, подразумевается масштаб 7. Это преобразование позволяет передавать доли секунд с точностью до девяти значащих цифр — максимум, поддерживаемый ODBC.

TypeПодразумеваемый масштаб 0Подразумеваемый масштаб 1..7
DBTIME2810,16
DBTIMESTAMP1921..27
DBTIMESTAMPOFFSET2628..34

В OLE DB, если происходит усечение с потерей данных, выдается сообщение об ошибке. Для типа datetime2 число разрядов для дробной секунды (масштаб) определяется размером целевого столбца согласно следующей таблице. Для размеров столбцов, превышающих диапазон в таблице, подразумевается масштаб 9. Это преобразование позволяет передавать доли секунд с точностью до девяти значащих цифр — максимум, поддерживаемый OLE DB.

TypeПодразумеваемый масштаб 0Подразумеваемый масштаб 1..9
DBTIME281..9
DBTIMESTAMP1921..29
DBTIMESTAMPOFFSET2628..36

4

Компонент даты не учитывается.

5

Часовой пояс устанавливается в формате UTC (например, 00:00).

6

Время установлено в нуль.

7

Для даты задается значение 1900-01-01.

8

Сдвиг часового пояса не учитывается.

9

Строка проходит синтаксический анализ и преобразуется в значение типа date, datetime, datetimeoffset или времени, в зависимости от первого встреченного знака препинания и наличия остальных компонентов. Затем строка преобразуется в целевой тип согласно правилам, описанным в таблице, приведенной в конце раздела, для типа исходных данных, который выясняется в процессе анализа. Если при синтаксическом анализе данных неизбежно возникает ошибка, или любой из компонентов вышел за пределы допустимого диапазона, или не существует преобразования из литерального типа в целевой тип, в случае OLE DB выдается сообщение об ошибке, а в случае ODBC создается запись диагностики ODBC с кодом SQLSTATE 22018 и сообщением «Недопустимое значение символа для спецификации преобразования». Для параметров типа datetime и smalldatetime, если значение года выходит за пределы допустимого диапазона, в случае OLE DB выдается сообщение об ошибке, а в случае ODBC создается запись диагностики ODBC с кодом SQLSTATE 22007 и сообщением «Недопустимый формат даты-времени».

Значение datetimeoffset после преобразования в UTC должно находиться в пределах диапазона, даже если преобразование в UTC не требуется. Причина этого заключается в том, что поток табличных данных и сервер всегда нормализуют время в значениях datetimeoffset для UTC, поэтому клиент должен проверять, что значение времени после преобразования в UTC находится в пределах поддерживаемого диапазона. Если значение выходит за пределы допустимого диапазона UTC , в случае OLE DB выдается сообщение об ошибке, а в случае ODBC создается запись диагностики ODBC с кодом SQLSTATE 22007 и сообщением «Недопустимый формат даты-времени».

10

Если в преобразовании с сервера на клиент происходит усечение с потерей данных, в случае OLE DB выдается сообщение об ошибке, а в случае ODBC создается запись диагностики ODBC с кодом SQLSTATE 22008 и сообщением «Недопустимый формат даты-времени». Эта ошибка также возникает в том случае, если значение выходит за пределы диапазона, который может быть представлен диапазоном UTC, используемым сервером. Если в преобразовании с сервера на клиент происходит усечение секунд или долей секунд, выдается только предупреждение.

11

Если происходит усечение с потерей данных, создается запись диагностики.

В преобразовании с сервера на клиент это предупреждение (ODBC SQLSTATE S1000).

В преобразовании с клиента на сервер это ошибка (ODBC SQLSTATE 22001).

12

Для секунд устанавливается значение 0, а доли секунды отбрасываются. Ошибка усечения невозможна.

Недоступно

Существующий способ работы SQL Server 2005 и более ранних версий сохранен.