Изменения в функции массового копирования для работы с улучшенными типами даты и времени (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)
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по