Новые функции даты и времени с предыдущими версиями 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
Все операторы сравнения разрешены для новых типов данных даты-времени, так как они отображаются как строковые типы, а не типы даты-времени.