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


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

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

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

Внимание

SQL Server Native Client (SNAC) не поставляется с:

  • SQL Server 2022 (16.x) и более поздних версий
  • SQL Server Management Studio 19 и более поздних версий

Собственный клиент SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для разработки новых приложений.

Для новых проектов используйте один из следующих драйверов:

Сведения о SQLNCLI, которые поставляется в качестве компонента SQL Server ядро СУБД (версии 2012–2019), см. в этом исключении жизненного цикла поддержки.

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

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

Тип файла хранилища Тип данных файла Ответ на запрос: "Введите тип хранения файлов для поля >имя_поля< [<default>]:"
Datetime SQLDATETIME d
Smalldatetime SQLDATETIM4 D
Дата SQLDATE de
Время 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
Дата 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 Значение
Datetime SQLDATETIME BCP_TYPE_SQLDATETIME 0x3d
Smalldatetime SQLDATETIM4 BCP_TYPE_SQLDATETIME4 0x3a
Дата SQLDATE BCP_TYPE_SQLDATE 0x28
Время 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 после выполнения клиентских преобразований, описанных ниже, значение секунд становится равным нулю. Округление даты-времени распространяется на часы и минуты, но не на дату.

До -->

From
Дата Время 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
Дата и время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)