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


Преобразования собственного клиента SQL Server, выполняемые с клиента на сервер

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

В этом разделе описываются преобразования даты и времени, выполняемые между клиентским приложением, написанным с помощью OLE DB sql Server Native Client OLE DB и SQL Server 2008 (10.0.x) (или более поздней версии).

Преобразования

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

Если не вызывается метод ICommandWithParameters::SetParameterInfo, привязки DBTYPE_DBTIMESTAMP преобразовываются, как если бы они имели тип datetime2.

В ->

Исходный тип
DBDATE (date) DBTIME (time) DBTIME2 (time) DBTIMESTAMP (smalldatetime) DBTIMESTAMP (datetime) DBTIMESTAMP (datetime2) DBTIMESTAMPOFFSET (datetimeoffset) STR WSTR SQLVARIANT

(sql_variant)
DATE 1,2 1,3,4 4,12 1,12 1,12 1,12 1,5, 12 1,12 1,12 1,12

datetime2(0)
DBDATE 1 - - 1,6 1,6 1,6 1,5, 6 1,10 1,10 1

date
DBTIME - 1 1 1,7 1,7 1,7 1,5, 7 1,10 1,10 1

Time(0)
DBTIME2 - 1,3 1 1,7,10,14 1,7,10,15 1,7,10 1,5,7,10 1,10,11 1,10,11 1

Time(7)
DBTIMESTAMP 1,2 1,3,4 1,4,10 1,10,14 1,10,15 1,10 1,5,10 1,10,11 1,10,11 1,10

datetime2(7)
DBTIMESTAMPOFFSET 1,2,8 1,3,4,8 1,4,8,10 1,8,10,14 1,8,10,15 1,8,10 1,10 1,10,11 1,10,11 1,10

datetimeoffset(7)
FILETIME 1,2 1,3,4 1,4,13 1,13 1,13 1,13 1,5,13 1,13 1,10 1,13

datetime2(3)
BYTES - - - - - - - Неприменимо Н/Д Неприменимо
VARIANT 1 1 1 1,10 1,10 1,10 1,10 Неприменимо Неприменимо 1,10
SSVARIANT 1,16 1,16 1,16 1,10,16 1,10,16 1,10,16 1,10,16 Неприменимо Неприменимо 1,16
BSTR 1,9 1,9 1,9,10 1,9,10 1,9,10 1,9,10 1,9,10 Неприменимо Н/Д Неприменимо
STR 1,9 1,9 1,9,10 1,9,10 1,9,10 1,9,10 1,9,10 Неприменимо Н/Д Неприменимо
WSTR 1,9 1,9 1,9,10 1,9,10 1,9,10 1,9,10 1,9,10 Неприменимо Н/Д Неприменимо

Расшифровка символов

Символ Значение
- Преобразование не поддерживается. Если при вызове IAccessor::CreateAccessor осуществляется проверка связывания, то в параметре rgStatus возвращается значение DBBINDSTATUS_UPSUPPORTEDCONVERSION. Если проверка метода доступа является отложенной, то устанавливается значение DBSTATUS_E_BADACCESSOR.
Неприменимо Не применимо.
1 Если поддерживаемые данные недопустимы, возвращается значение DBSTATUS_E_CANTCONVERTVALUE. Входные данные проверяются до выполнения преобразований, поэтому, даже если компонент не будет обрабатываться последующим преобразованием, он должен иметь допустимое значение, чтобы это преобразование завершилось успешно.
2 Поля времени не учитываются.
3 Доли секунды должны иметь нулевое значение, иначе возвращается значение DBSTATUS_E_DATAOVERFLOW.
4 Компонент даты не учитывается.
5 Часовой пояс устанавливается в соответствии с часовым поясом клиента.
6 Время установлено в нуль.
7 Дата устанавливается в текущую дату.
8 Время преобразуется в формат UTC. Если во время преобразования происходит ошибка, возвращается значение DBSTATUS_E_CANTCONVERTVALUE.
9 Строка анализируется как литерал ISO и преобразуется в целевой тип. Если попытка оказалась неудачной, то строка анализируется как литерал даты OLE (который также содержит компоненты времени) и преобразуется из даты OLE (DBTYPE_DATE) в целевой тип.

Если целевым типом является DBTIMESTAMP, smalldatetime, datetimeили datetime2, строка должна соответствовать синтаксису литералов типа date, time или datetime2 либо синтаксису, распознаваемому OLE. Если строка является литералом типа date, все компоненты времени принимают нулевое значение. Если строка является литералом типа time, дата устанавливается в текущую дату.

Для всех других типов строка должна соответствовать синтаксису литералов целевого типа.
10 Если усечение долей секунды происходит с потерей данных, возвращается значение DBSTATUS_E_DATAOVERFLOW. Проверка переполнения при преобразовании строк возможна, только если строка соответствует синтаксису ISO. Если строка является литералом даты OLE, доли секунды округляются.

Для преобразования из DBTIMESTAMP (datetime) в smalldatetime SQL Server Native Client автоматически усечет значение секунд, а не вызовет ошибку DBSTATUS_E_DATAOVERFLOW.
11 Количество знаков долей секунды (масштаб) определяется размером целевого столбца согласно таблице ниже. Для размеров столбцов, превышающих диапазон таблицы, подразумевается масштаб 9. Это преобразование позволяет передавать доли секунд с точностью до девяти значащих цифр — максимум, поддерживаемый OLE DB.

Однако, если исходным типом является DBTIMESTAMP, а доли секунды равны нулю, знаки долей секунды и десятичная запятая не формируются. Такое поведение гарантирует обратную совместимость для приложений, использующих более старые версии поставщиков OLE DB.

Длина столбца ~0 подразумевает неограниченный размер в OLE DB (9 знаков, если для DBTIMESTAMP не применяется правило 3 знаков).
12 Семантика преобразования до SQL Server 2008 (10.0.x) для DBTYPE_DATE поддерживается. Доли секунды усекаются до нуля.
13 Семантика преобразования до SQL Server 2008 (10.0.x) для DBTYPE_FILETIME поддерживается. Если используется API-интерфейс FileTimeToSystemTime Windows, точность долей секунды ограничивается 1 миллисекундой.
14 Семантика преобразования до SQL Server 2008 (10.0.x) для smalldatetime сохраняется. Секундам присваивается нулевое значение.
15 Семантика преобразования до SQL Server 2008 (10.0.x) для datetime сохраняется. Секунды округляются до ближайшей 300-ой секунды.
16 Поведение преобразования значения (конкретного типа), внедренное в клиентскую структуру SSVARIANT, совпадает с поведением того же значения с тем же типом, не встроенного в структуру SSVARIANT.
Вид Длина (в символах) Масштабирование
DBTIME2 8, 10..18 0,1..9
DBTIMESTAMP 19, 21..29 0,1..9
DBTIMESTAMPOFFSET 26, 28..36 0,1..9

См. также

Привязки и преобразования (OLE DB)