Изменения в функции массового копирования для работы с улучшенными типами даты-времени (OLE DB и ODBC)
Описываются новые возможности даты-времени для поддержки операций массового копирования. Приведенные в данном разделе сведения верны как для OLE DB, так и для ODBC в собственном клиенте SQL Server.
Файлы форматирования
При интерактивном построении файлов форматирования следующая таблица описывает вводные данные для задания типов даты-времени и соответствующих имен типов данных из файлов размещения.
Тип файлового хранилища |
Тип данных основного файла |
Ответ на приглашение: \Введите тип хранения файлов для поля <имя_поля> [<значение_по_умолчанию>]:" |
---|---|---|
Datetime |
SQLDATETIME |
d |
Smalldatetime |
SQLDATETIM4 |
D |
Дата |
SQLDATE |
de |
Время |
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.
В файлах данных в собственном формате значения даты и времени четырех новых типов представлены в виде потока табличных данных с масштабом 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 |
Дата |
SQLDATE |
BCP_TYPE_SQLDATE |
0x28 |
Время |
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 |
---|---|---|---|---|---|---|---|---|
Дата |
1 |
- |
1,6 |
1,6 |
1,6 |
1,5,6 |
1,3 |
1,3 |
Время |
н/д |
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 не требуется. Это требование вызвано тем, что поток табличных данных и сервер всегда нормализуют время в значениях типа datetimeoffset для времени в формате UTC. Поэтому клиент должен проверить, попадают ли в поддерживаемый диапазон компоненты времени после преобразования в UTC. |
||||||||||||||||||||||||||||||||
2 |
Компонент времени не учитывается. |
||||||||||||||||||||||||||||||||
3 |
Для ODBC, если происходит усечение с потерей данных, создается запись диагностики с кодом SQLSTATE 22001 и сообщением «Строковые данные, усечение справа». Количество разрядов для дробной секунды (масштаб) определяется размером целевого столбца согласно следующей таблице. Для размеров столбцов, превышающих диапазон в таблице, подразумевается масштаб 7. Это преобразование позволяет передавать доли секунд с точностью до девяти значащих цифр — максимум, поддерживаемый ODBC.
В OLE DB, если происходит усечение с потерей данных, выдается сообщение об ошибке. Для типа datetime2 число разрядов для дробной секунды (масштаб) определяется размером целевого столбца согласно следующей таблице. Для размеров столбцов, превышающих диапазон в таблице, подразумевается масштаб 9. Это преобразование позволяет передавать доли секунд с точностью до девяти значащих цифр — максимум, поддерживаемый OLE DB.
|
||||||||||||||||||||||||||||||||
4 |
Компонент даты не учитывается. |
||||||||||||||||||||||||||||||||
5 |
Часовой пояс устанавливается в формате UTC (например, 00:00). |
||||||||||||||||||||||||||||||||
6 |
Время установлено в нуль. |
||||||||||||||||||||||||||||||||
7 |
Для даты задается значение 1900-01-01. |
||||||||||||||||||||||||||||||||
8 |
Сдвиг часового пояса не учитывается. |
||||||||||||||||||||||||||||||||
9 |
Строка проходит синтаксический анализ и преобразуется в значение типа date, datetime, datetimeoffset или time в зависимости от первого встреченного знака препинания и наличия остальных компонентов. Затем строка преобразуется в целевой тип согласно правилам, описанным в таблице, приведенной в конце раздела, для типа исходных данных, который выясняется в процессе анализа. Если при синтаксическом анализе данных неизбежно возникает ошибка, любой из компонентов вышел за пределы допустимого диапазона или не существует преобразования из литерального типа в целевой тип, то в случае 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 и более ранних версий сохранен. |