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

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

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

Внимание

Собственный клиент SQL Server (часто сокращенный SNAC) был удален из SQL Server 2022 (16.x) и SQL Server Management Studio 19 (SSMS). Собственный клиент SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для разработки новых приложений. Перейдите на новый драйвер Microsoft OLE DB (MSOLEDBSQL) для SQL Server или последний драйвер Microsoft ODBC для SQL Server . Сведения о SQLNCLI, которые поставляется в качестве компонента ядра СУБД SQL Server (версии 2012–2019), см. в этом исключении жизненного цикла поддержки.

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

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

Тип файла хранилища Тип данных файла Ответ на запрос: "Введите тип хранения файлов для поля >имя_поля< [<default>]:"
Дата и время SQLDATETIME дн.
Smalldatetime SQLDATETIM4 D
Дата SQLDATE de
Time SQLTIME te
Дата и время2 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 или поддержки типов данных для улучшения даты и времени OLE DB для OLE DB.

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

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

Тип файла хранилища Объем памяти в байтах
datetime 8
smalldatetime 4
date 3
Время 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 значение
Дата и время SQLDATETIME BCP_TYPE_SQLDATETIME 0x3d
Smalldatetime SQLDATETIM4 BCP_TYPE_SQLDATETIME4 0x3a
Дата SQLDATE BCP_TYPE_SQLDATE 0x28
Time SQLTIME BCP_TYPE_SQLTIME 0x29
Дата и время2 SQLDATETIME2 BCP_TYPE_SQLDATETIME2 0x2a
Datetimeoffset SQLDATETIMEOFFSET BCP_TYPE_SQLDATETIMEOFFSET 0x2b

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

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

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

До -->

Исходный тип
date Время smalldatetime datetime datetime2 datetimeoffset char wchar
Дата 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
Дата и время 1,2 1,4,10 1,12 1 1,10 1,5,10 1,11 1,11
Дата и время2 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.

Тип: DBTIME2

Подразумеваемый масштаб 0 8

Подразумеваемый масштаб 1.7 10 16



Тип: DBTIMESTAMP

Подразумеваемый масштаб 0: 19

Подразумеваемый масштаб 1..7: 21..27



Тип: DBTIMESTAMPOFFSET

Подразумеваемый масштаб 0: 26

Подразумеваемый масштаб 1..7: 28..34

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

Тип: DBTIME2

Подразумеваемый масштаб 0 8

Подразумеваемый масштаб 1..9 1..9



Тип: DBTIMESTAMP

Подразумеваемый масштаб 0: 19

Подразумеваемый масштаб 1..9: 21..29



Тип: DBTIMESTAMPOFFSET

Подразумеваемый масштаб 0: 26

Подразумеваемый масштаб 1..9: 28..36
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 (9.x) и более раннее поведение поддерживается.

См. также

Улучшения функций даты и времени (ODBC)
Улучшения функций даты и времени (OLE DB)