Поделиться через


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

См. также

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