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


Новые функции даты и времени с предыдущими версиями SQL Server (OLE DB)

Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)

В этом разделе описывается ожидаемое поведение, когда клиентское приложение, использующее расширенные функции даты и времени, взаимодействует с версией SQL Server ранее, чем SQL Server 2008 (10.0.x), и когда клиент, скомпилированный с версией собственного клиента SQL Server ранее, чем SQL Server 2008 (10.0.x), отправляет команды на сервер, поддерживающий расширенные функции даты и времени.

Работа в клиентах низкого уровня

Клиентские приложения, использующие версию собственного клиента SQL Server ранее, чем SQL Server 2008 (10.0.x), видят новые типы даты и времени в виде столбцов nvarchar . Содержимое столбца представлено литералом. Дополнительные сведения см. в разделе "Форматы данных: строки и литералы" поддержки типов данных для улучшения даты и времени OLE DB. Размер столбца представляет максимальную длину литерала для точности, указанной для столбца.

API каталога возвращают метаданные, согласованные с кодом типа данных нижнего уровня, возвращенным клиенту (например, nvarchar) и соответствующим представлением нижнего уровня (например, соответствующим литеральным форматом). Однако имя типа данных, возвращаемое, будет реальным именем типа SQL Server 2008 (10.0.x).

Если клиентское приложение нижнего уровня работает с сервером SQL Server 2008 (10.0.x) (или более поздней версии), на котором были сделаны изменения схемы на типы даты и времени, ожидаемое поведение выглядит следующим образом:

Тип клиента OLE DB Тип SQL Server 2005 Тип SQL Server 2008 (или более поздних версий) Преобразование результата (сервер-клиент) Преобразование параметра (клиент-сервер)
DBTYPE_DBDATE Datetime Дата ОК ОК
DBTYPE_DBTIMESTAMP Поля времени устанавливаются в нули. IRowsetChange завершится ошибкой из-за усечения строки, если поле времени не равно нулю.
DBTYPE_DBTIME Time(0) ОК ОК
DBTYPE_DBTIMESTAMP Поля даты устанавливаются в текущую дату. IRowsetChange завершится ошибкой из-за усечения строк, если дробные секунды не равны нулю.

Дата не учитывается.
DBTYPE_DBTIME Time(7) Сбой — недопустимый литерал времени. ОК
DBTYPE_DBTIMESTAMP Сбой — недопустимый литерал времени. ОК
DBTYPE_DBTIMESTAMP Datetime2(3) ОК ОК
DBTYPE_DBTIMESTAMP Datetime2(7) ОК ОК
DBTYPE_DBDATE Smalldatetime Дата ОК ОК
DBTYPE_DBTIMESTAMP Поля времени устанавливаются в нули. IRowsetChange завершится ошибкой из-за усечения строки, если поле времени не равно нулю.
DBTYPE_DBTIME Time(0) ОК ОК
DBTYPE_DBTIMESTAMP Поля даты устанавливаются в текущую дату. IRowsetChange завершится ошибкой из-за усечения строк, если дробные секунды не равны нулю.

Дата не учитывается.
DBTYPE_DBTIMESTAMP Datetime2(0) ОК ОК

ОК означает, что если он работал с SQL Server 2005 (9.x), он должен продолжать работать с SQL Server 2008 (10.0.x) (или более поздней версии).

Учтены только следующие типичные изменения схемы.

  • Использование нового типа, когда логически приложению необходимо только значение даты или времени. Однако приложение было вынуждено использовать datetime или smalldatetime, так как отдельные типы даты и времени недоступны.

  • Использование нового типа для получения долей секунд c более высокой точностью.

  • Переключение на datetime2 , так как это предпочтительный тип данных для даты и времени.

Приложения, использующие метаданные сервера, полученные через ICommandWithParameters::GetParameterInfo или наборы строк схемы для задания сведений о типе параметров с помощью ICommandWithParameters::SetParameterInfo, завершаются сбоем во время преобразования клиента, где строковое представление исходного типа больше строкового представления целевого типа. Например, если привязка клиента использует DBTYPE_DBTIMESTAMP, а столбец сервера — дата, то собственный клиент SQL Server преобразует значение в "гггг-дд-мм чч:мм:ss.fff", но метаданные сервера будут возвращены как nvarchar(10). В результате переполнение приведет к ошибке DBSTATUS_E_CATCONVERTVALUE. Аналогичные проблемы возникают при преобразовании данных IRowsetChange, так как метаданные набора строк задаются из метаданных набора результатов.

Метаданные параметров и наборов строк

В этом разделе описываются метаданные для параметров, столбцов результатов и наборов строк схемы для клиентов, скомпилированных с версией СОБСТВЕННОго клиента SQL Server до SQL Server 2008 (10.0.x).

ICommandWithParameters::GetParameterInfo

Структура DBPARAMINFO возвращает следующие сведения с помощью параметра prgParamInfo :

Тип параметра wType ulParamSize bPrecision bScale
Дата DBTYPE_WSTR 10 ~0 ~0
Время DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

Обратите внимание, что некоторые из этих диапазонов значений не являются непрерывными, например в последовательности 8, 10… 16 отсутствует значение 9. Это следствие добавления десятичной запятой, когда точность в долях секунды выше нуля.

IColumnsRowset::GetColumnsRowset

Возвращаются следующие столбцы.

Тип столбца DBCOLUMN_TYPE DBCOLUMN_COLUMNSIZE DBCOLUMN_PRECISION DBCOLUMN_SCALE, DBCOLUMN_DATETIMEPRECISION
Дата DBTYPE_WSTR 10 NULL NULL
Время DBTYPE_WSTR 8, 10..16 NULL NULL
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 NULL NULL
datetimeoffset DBTYPE_WSTR 26,28..34 NULL NULL

ColumnsInfo::GetColumnInfo

Структура DBCOLUMNINFO возвращает следующие данные.

Тип параметра wType ulColumnSize bPrecision bScale
Дата DBTYPE_WSTR 10 ~0 ~0
time(1..7) DBTYPE_WSTR 8, 10..16 ~0 ~0
smalldatetime DBTYPE_DBTIMESTAMP 16 16 0
datetime DBTYPE_DBTIMESTAMP 16 23 3
datetime2 DBTYPE_WSTR 19,21..27 ~0 ~0
datetimeoffset DBTYPE_WSTR 26,28..34 ~0 ~0

Наборы строк схемы

В этом разделе рассматриваются метаданные для параметров, результирующих столбцов и наборов строк схемы для новых типов данных. Эта информация полезна для того, чтобы у вас был поставщик клиента, разработанный с помощью средств, предшествующих SQL Server 2008 (10.0.x) собственного клиента SQL Server.

COLUMNS, набор строк

Для типов даты-времени возвращаются значения следующих столбцов.

Тип столбца DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH DATETIME_PRECISION
Дата DBTYPE_WSTR 10 20 NULL
Время DBTYPE_WSTR 8, 10..16 16,20..32 NULL
smalldatetime DBTYPE_DBTIMESTAMP NULL NULL 0
datetime DBTYPE_DBTIMESTAMP NULL NULL 3
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 NULL
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 NULL

Набор строк PROCEDURE_PARAMETERS

Для типов даты-времени возвращаются значения следующих столбцов.

Тип столбца DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH TYPE_NAME

LOCAL_TYPE_NAME
Дата DBTYPE_WSTR 10 20 Дата
Время DBTYPE_WSTR 8, 10..16 16,20..32 Время
smalldatetime DBTYPE_DBTIMESTAMP NULL NULL smalldatetime
datetime DBTYPE_DBTIMESTAMP NULL NULL datetime
datetime2 DBTYPE_WSTR 19,21..27 38,42..54 datetime2
datetimeoffset DBTYPE_WSTR 26,28..34 52, 56..68 datetimeoffset

Набор строк PROVIDER_TYPES

Для типов даты-времени возвращаются следующие строки:

Тип — >

Column
Дата Время smalldatetime datetime datetime2 datetimeoffset
TYPE_NAME Дата Время smalldatetime datetime datetime2 datetimeoffset
DATA_TYPE DBTYPE_WSTR DBTYPE_WSTR DBTYPE_DBTIMESTAMP DBTYPE_DBTIMESTAMP DBTYPE_WSTR DBTYPE_WSTR
COLUMN_SIZE 10 16 16 23 27 34
LITERAL_PREFIX ' ' ' ' ' '
LITERAL_SUFFIX ' ' ' ' ' '
CREATE_PARAMS NULL NULL NULL NULL NULL NULL
IS_NULLABLE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE VARIANT_TRUE
CASE_SENSITIVE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
ДОСТУПНЫЙ ДЛЯ ПОИСКА DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE DB_SEARCHABLE
UNSIGNED_ATTRIBUTE NULL NULL NULL NULL NULL NULL
FIXED_PREC_SCALE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
AUTO_UNIQUE_VALUE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
LOCAL_TYPE_NAME Дата Время smalldatetime datetime datetime2 datetimeoffset
MINIMUM_SCALE NULL NULL NULL NULL NULL NULL
MAXIMUM_SCALE NULL NULL NULL NULL NULL NULL
GUID NULL NULL NULL NULL NULL NULL
TYPELIB NULL NULL NULL NULL NULL NULL
ВЕРСИЯ NULL NULL NULL NULL NULL NULL
IS_LONG VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE
BEST_MATCH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_TRUE VARIANT_FALSE VARIANT_FALSE
IS_FIXEDLENGTH VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE VARIANT_FALSE

Работа сервера низкого уровня

При подключении к серверу более ранней версии, чем SQL Server 2008 (10.0.x), любая попытка использовать новые имена типов сервера (например, с ICommandWithParameters::SetParameterInfo или ITableDefinition::CreateTable) приведет к DB_E_BADTYPENAME.

Если новые типы привязываются к параметрам или результатам без указания имени типа и новый тип неявным образом указывает на серверный тип данных либо отсутствует допустимое преобразование из серверного типа данных в клиентский, то возвращается ошибка DB_E_ERRORSOCCURRED, а DBBINDSTATUS_UNSUPPORTED_CONVERSION устанавливается в состояние привязки для метода доступа, используемого Execute.

Если существует поддерживаемое клиентское преобразование из типа буфера в серверный тип данных для той версии сервера, с которым установлено соединение, то могут быть использованы все типы данных буфера клиента. В этом контексте тип сервера означает тип, указанный ICommandWithParameters::SetParameterInfo, или подразумеваемый типом буфера, если ICommandWithParameters::SetParameterInfo не был вызван. Это означает, что DBTYPE_DBTIME2 и DBTYPE_DBTIMESTAMPOFFSET могут быть использованы с серверами низкого уровня или при DataTypeCompatibility=80, если клиентское преобразование к поддерживаемому серверному типу данных выполнено успешно. Конечно, если обнаружен неверный серверный тип данных, то сервер может сообщить об ошибке, если не удается выполнить неявное преобразование к действительному серверному типу данных.

Поведение SSPROP_INIT_DATATYPECOMPATIBILITY

Если SSPROP_INIT_DATATYPECOMPATIBILITY задано значение SSPROPVAL_DATATYPECOMPATIBILITY_SQL2000, новые типы даты и времени и связанные метаданные отображаются клиентами, как они отображаются для клиентов нижнего уровня, как описано в разделе "Изменения массового копирования для расширенных типов даты и времени" (OLE DB и ODBC).

Сравнимость для IRowsetFind

Все операторы сравнения разрешены для новых типов данных даты-времени, так как они отображаются как строковые типы, а не типы даты-времени.

См. также

Улучшения функций даты и времени (OLE DB)