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

2

У приложения, работавшего с SQL Server 2005, могут возникать ошибки с SQL Server 2008.

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

  • Использование нового типа, когда логически приложению необходимо только значение даты или времени. Однако приложение было вынуждено использовать типы 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 и сообщением «Нарушение атрибута ограниченного типа данных».

См. также

Основные понятия