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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тип столбца date Время smalldatetime datetime datetime2 datetimeoffset
DATA_TYPE SQL_WVARCHAR SQL_WVARCHAR SQL_TYPE_TIMESTAMP SQL_TYPE_TIMESTAMP SQL_WVARCHAR SQL_WVARCHAR
TYPE_NAME date Время 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

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

Тип столбца date Время smalldatetime datetime datetime2 datetimeoffset
TYPE_NAME date Время 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 date Время 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 (10.0.x) любая попытка использовать новые типы серверов или связанные коды метаданных и поля дескриптора приведет к возврату SQL_ERROR. Будет сформирована диагностическая запись с ошибкой SQLSTATE HY004 и сообщением «Недопустимый тип данных SQL для версии сервера при соединении» или с ошибкой 07006 и сообщением «Нарушение атрибута ограниченного типа данных».

См. также

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