Улучшенная работа типа даты-времени с предыдущими версиями SQL Server (ODBC)

Применимо к: даSQL Server (все поддерживаемые версии) ДаБаза данных SQL Azure ДаУправляемый экземпляр SQL Azure даAzure Synapse Analytics даПараллельное хранилище данных

В этом разделе описывается ожидаемое поведение клиентских приложений, использующих улучшенные функции даты и времени, которые подключаются к SQL Server версий более ранних, чем SQL Server 2008, а также в случаях, когда клиентское приложение использует компоненты доступа к данным MDAC, Windows DAC или собственный клиент SQL Server версии более ранней, чем SQL Server 2008 для отправки команд на сервер, поддерживающий улучшенные функции даты и времени.

Работа в клиентах низкого уровня

Клиентские приложения, скомпилированные с помощью собственного клиента SQL Server версии более ранней, чем SQL Server 2008, распознают новые типы даты и времени, как столбцы nvarchar. Содержимое столбца представляет собой литеральное представление, как описано в разделе "форматы данных: строки и литералы" статьи Поддержка типов данных для улучшения даты и времени ODBC. Размер столбца равен максимальной длине литерала для долей секунды, указываемых с заданной для столбца точностью.

API-интерфейсы каталога возвращают метаданные, согласующиеся с кодом типа данных низкого уровня, полученного клиентом (например, nvarchar) и со связанным представлением низкого уровня (например, с соответствующим форматом литерала). Тем не менее, будет возвращено реальное имя типа данных SQL Server 2008.

Метаданные инструкции, возвращаемые SQLDescribeCol, SQLDescribeParam, Скжетдескфиелд и SQLColAttribute, будут возвращать метаданные, которые согласуются с типом нижнего уровня во всех отношениях, включая имя типа. Примером такого типа нижнего уровня является nvarchar.

Если клиентское приложение нижнего уровня выполняется SQL Server 2008 на сервере (или более поздней версии), на котором изменения схемы производятся в типах даты и времени, то ожидаемое поведение выглядит следующим образом:

Тип SQL Server 2005 SQL Server 2008Тип (или более поздних версий) Клиентский тип ODBC Преобразование результата (из SQL в C) Преобразование параметров (из C в SQL)
Datetime Дата SQL_C_TYPE_DATE ОК ОК (1)
SQL_C_TYPE_TIMESTAMP Поля времени устанавливаются в нули. OK (2)

Завершается ошибкой, если значение поля времени не равно нулю. Работает с SQL Server 2005 (9.x).
Time(0) SQL_C_TYPE_TIME ОК ОК (1)
SQL_C_TYPE_TIMESTAMP Поля даты устанавливаются в текущую дату. OK (2)

Дата пропускается. Ошибка, если доли секунды не равны нулю. Работает с SQL Server 2005 (9.x).
Time(7) SQL_C_TIME Сбой-недопустимый литерал времени. ОК (1)
SQL_C_TYPE_TIMESTAMP Сбой-недопустимый литерал времени. ОК (1)
Datetime2 (3) SQL_C_TYPE_TIMESTAMP ОК ОК (1)
Datetime2 (7) SQL_C_TYPE_TIMESTAMP ОК Значение округляется до 1/300 секунды при преобразовании на клиенте.
Smalldatetime Дата SQL_C_TYPE_DATE ОК ОК
SQL_C_TYPE_TIMESTAMP Поля времени устанавливаются в нули. OK (2)

Завершается ошибкой, если значение поля времени не равно нулю. Работает с SQL Server 2005 (9.x).
Time(0) SQL_C_TYPE_TIME ОК ОК
SQL_C_TYPE_TIMESTAMP Поля даты устанавливаются в текущую дату. OK (2)

Дата пропускается. Ошибка, если доли секунды не равны нулю.

Работает с SQL Server 2005 (9.x).
Datetime2(0) SQL_C_TYPE_TIMESTAMP ОК ОК

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

Символ Значение
1 Если код работал в SQL Server 2005 (9.x), то он должен работать и с последующими версиями SQL Server.
2 У приложения, работавшего с SQL Server 2005 (9.x), могут возникать ошибки с более поздними версиями SQL Server.

Обратите внимание, что рассматриваются только типичные изменения схемы. Ниже приводятся типичные изменения.

  • Использование нового типа, когда логически приложению необходимо только значение даты или времени. Однако приложение было вынуждено использовать типы datetime или smalldatetime из-за отсутствия отдельных типов для даты и времени.

  • Использование нового типа для получения долей секунд c более высокой точностью.

  • Переключение на тип datetime2, поскольку это предпочтительный тип для данных даты и времени.

Метаданные столбцов, возвращаемые SQLColumns, SQLProcedureColumns и SQLSpecialColumns

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

Тип столбца Дата time smalldatetime DATETIME datetime2 datetimeoffset
DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP SQL_WVARCHAR SQL_WVARCHAR
TYPE_NAME Дата time smalldatetime DATETIME datetime2 datetimeoffset
COLUMN_SIZE 10 8, 10.16 16 23 19, 21..27 26, 28..34
BUFFER_LENGTH 20 16, 20.. 32 16 16 38, 42.. 54 52, 56.. 68
DECIMAL_DIGITS NULL NULL 0 3 NULL NULL
SQL_DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_DATETIME SQL_DATETIME SQL_WVARCHAR SQL_WVARCHAR
SQL_DATETIME_SUB NULL NULL SQL_CODE_TIMESTAMP SQL_CODE_TIMESTAMP NULL NULL
CHAR_OCTET_LENGTH NULL NULL NULL NULL NULL NULL
SS_DATA_TYPE 0 0 111 111 0 0

SQLSpecialColumns не возвращает SQL_DATA_TYPE, SQL_DATETIME_SUB, CHAR_OCTET_LENGTH или SS_DATA_TYPE.

Метаданные типа данных, возвращенные SQLGetTypeInfo

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

Тип столбца Дата time smalldatetime DATETIME datetime2 datetimeoffset
TYPE_NAME Дата time smalldatetime DATETIME datetime2 datetimeoffset
DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP SQL_WVARCHAR SQL_WVARCHAR
COLUMN_SIZE 10 16 16 23 27 34
LITERAL_PREFIX ' ' ' ' ' '
LITERAL_SUFFIX ' ' ' ' ' '
CREATE_PARAMS NULL NULL NULL NULL NULL NULL
NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE SQL_NULLABLE
CASE_SENSITIVE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE
ДОСТУПНЫЙ ДЛЯ ПОИСКА SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE SQL_PRED_SEARCHABLE
UNSIGNED_ATTRIBUTE NULL NULL NULL NULL NULL NULL
FXED_PREC_SCALE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE SQL_FALSE
AUTO_UNIQUE_VALUE NULL NULL NULL NULL NULL NULL
LOCAL_TYPE_NAME Дата time smalldatetime DATETIME datetime2 datetimeoffset
MINIMUM_SCALE NULL NULL 0 3 NULL NULL
MAXIMUM_SCALE NULL NULL 0 3 NULL NULL
SQL_DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_DATETIME SQL_DATETIME SQL_WVARCHAR SQL_WVARCHAR
SQL_DATETIME_SUB NULL NULL SQL_CODE_TIMESTAMP SQL_CODE_TIMESTAMP NULL NULL
NUM_PREC_RADIX NULL NULL NULL NULL NULL NULL
INTERVAL_PRECISION NULL NULL NULL NULL NULL NULL
USERTYPE 0 0 12 22 0 0

Работа сервера низкого уровня

При соединении с экземпляром сервера версии более ранней, чем SQL Server 2008, любые попытки использовать новые серверные типы или связанные с ними коды метаданных и поля дескрипторов приводят к возврату ошибки SQL_ERROR. Будет сформирована диагностическая запись с ошибкой SQLSTATE HY004 и сообщением «Недопустимый тип данных SQL для версии сервера при соединении» или с ошибкой 07006 и сообщением «Нарушение атрибута ограниченного типа данных».

См. также:

Улучшения даты и времени (ODBC)