Улучшенная работа типа даты-времени с предыдущими версиями 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 и сообщением «Нарушение атрибута ограниченного типа данных».
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по