Улучшенная работа типа даты-времени с предыдущими версиями 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 и сообщением «Нарушение атрибута ограниченного типа данных».