Улучшенная работа типов даты-времени с предыдущими версиями SQL Server (ODBC)
В этом разделе описывается ожидаемое поведение клиентских приложений, использующих улучшенные функции даты и времени, которые подключаются к 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, SQGetDescField и SQLColAttribute возвращают метаданные инструкций, согласующиеся с типом низкого уровня во всех отношениях, включая имя типа. Примером такого типа низкого уровня является nvarchar.
При запуске клиентского приложения низкого уровня на сервере SQL Server 2008 (или более поздней версии), на котором в схему были внесены изменения в типы даты и времени, следует ожидать таких результатов.
Тип SQL Server 2005 |
Тип SQL Server 2008 (или более поздних версий) |
Клиентский тип ODBC |
Преобразование результата (из SQL в C) |
Преобразование параметров (из C в SQL) |
---|---|---|---|---|
Datetime |
Date |
SQL_C_TYPE_DATE |
ОК |
OK (1) |
SQL_C_TYPE_TIMESTAMP |
Поля времени устанавливаются в нули. |
OK (2) Завершается ошибкой, если значение поля времени не равно нулю. Работает с SQL Server 2005. |
||
Time(0) |
SQL_C_TYPE_TIME |
ОК |
OK (1) |
|
SQL_C_TYPE_TIMESTAMP |
Поля даты устанавливаются в текущую дату. |
OK (2) Дата пропускается. Ошибка, если доли секунды не равны нулю. Работает с SQL Server 2005. |
||
Time(7) |
SQL_C_TIME |
Ошибка — недопустимый литерал времени. |
OK (1) |
|
SQL_C_TYPE_TIMESTAMP |
Ошибка — недопустимый литерал времени. |
OK (1) |
||
Datetime2(3) |
SQL_C_TYPE_TIMESTAMP |
ОК |
OK (1) |
|
Datetime2(7) |
SQL_C_TYPE_TIMESTAMP |
ОК |
Значение округляется до 1/300 секунды при преобразовании на клиенте. |
|
Smalldatetime |
Date |
SQL_C_TYPE_DATE |
ОК |
ОК |
SQL_C_TYPE_TIMESTAMP |
Поля времени устанавливаются в нули. |
OK (2) Завершается ошибкой, если значение поля времени не равно нулю. Работает с SQL Server 2005. |
||
Time(0) |
SQL_C_TYPE_TIME |
ОК |
ОК |
|
SQL_C_TYPE_TIMESTAMP |
Поля даты устанавливаются в текущую дату. |
OK (2) Дата пропускается. Ошибка, если доли секунды не равны нулю. Работает с SQL Server 2005. |
||
Datetime2(0) |
SQL_C_TYPE_TIMESTAMP |
ОК |
ОК |
Расшифровка символов
Символ |
Значение |
---|---|
1 |
Если код работал в SQL Server 2005, то он должен работать и с последующими версиями SQL Server. |
2 |
У приложения, работавшего с SQL Server 2005, могут возникать ошибки с более поздними версиями SQL Server. |
Обратите внимание, что рассматриваются только типичные изменения схемы. Ниже приводятся типичные изменения.
Использование нового типа, когда логически приложению необходимо только значение даты или времени. Однако приложение было вынуждено использовать типы datetime или smalldatetime из-за отсутствия отдельных типов для даты и времени.
Использование нового типа для получения долей секунд c более высокой точностью.
Переключение на тип datetime2, поскольку это предпочтительный тип для данных даты и времени.
Метаданные столбцов, возвращаемые SQLColumns, SQLProcedureColumns и SQLSpecialColumns
Для типов даты-времени возвращаются значения следующих столбцов.
Тип столбца |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
---|---|---|---|---|---|---|
DATA_TYPE |
SQL_WVARCHAR |
SQL_WVARCHAR |
SQL_TYPE_TIMESTAMP |
SQL_TYPE_TIMESTAMP |
SQL_WVARCHAR |
SQL_WVARCHAR |
TYPE_NAME |
date |
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
Для типов даты-времени возвращаются значения следующих столбцов.
Тип столбца |
date |
time |
smalldatetime |
datetime |
datetime2 |
datetimeoffset |
---|---|---|---|---|---|---|
TYPE_NAME |
date |
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 |
SEARCHABLE |
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 |
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 и сообщением «Нарушение атрибута ограниченного типа данных».