Преобразования из C в SQL
В данном разделе перечисляются проблемы, которые следует принимать во внимание при преобразовании типов языка C в типы даты-времени SQL Server.
Преобразования, описанные в следующей таблице, относятся к преобразованиям, совершаемым на клиенте. В случае, когда клиент задает для параметра точность долей секунды, отличную от заданной на сервере, преобразование на клиенте, возможно, завершится успешно, но сервер возвратит ошибку при вызове функций SQLExecute или SQLExecuteDirect. В частности, ODBC рассматривает любое усечение долей секунды как ошибку, в то время как SQL Server их округляет; например, округление произойдет при переходе от datetime2(6) к datetime2(2). Значения столбцов даты-времени округляются до 1/300 секунды, а в значениях типа smalldatetime сервер устанавливает для секунд значение, равное нулю.
SQL_TYPE_DATE |
SQL_TYPE_TIME |
SQL_SS_TIME2 |
SQL_TYPE_TIMESTAMP |
SQL_SS_TIMSTAMPOFFSET |
SQL_CHAR |
SQL_WCHAR |
|
SQL_C_DATE |
1 |
- |
- |
1,6 |
1,5,6 |
1,13 |
1,13 |
SQL_C_TIME |
- |
1 |
1 |
1,7 |
1,5,7 |
1,13 |
1,13 |
SQL_C_SS_TIME2 |
- |
1,3 |
1,10 |
1,7 |
1,5,7 |
1,13 |
1,13 |
SQL_C_BINARY(SQL_SS_TIME2_STRUCT) |
н/д |
н/д |
1,10,11 |
н/д |
н/д |
н/д |
н/д |
SQL_C_TYPE_TIMESTAMP |
1,2 |
1,3,4 |
1,4,10 |
1,10 |
1,5,10 |
1,13 |
1,13 |
SQL_C_SS_TIMESTAMPOFFSET |
1,2,8 |
1,3,4,8 |
1,4,8,10 |
1,8,10 |
1,10 |
1,13 |
1,13 |
SQL_C_BINARY(SQL_SS_TIMESTAMPOFFSET_STRUCT) |
н/д |
н/д |
н/д |
н/д |
1,10,11 |
н/д |
н/д |
SQL_C_CHAR/SQL_WCHAR (date) |
9 |
9 |
9 |
9,6 |
9,5,6 |
н/д |
н/д |
SQL_C_CHAR/SQL_WCHAR (time2) |
9 |
9,3 |
9,10 |
9,7,10 |
9,5,7,10 |
н/д |
н/д |
SQL_C_CHAR/SQL_WCHAR (datetime) |
9,2 |
9,3,4 |
9,4,10 |
9,10 |
9,5,10 |
н/д |
н/д |
SQL_C_CHAR/SQL_WCHAR (datetimeoffset) |
9,2,8 |
9,3,4,8 |
9,4,8,10 |
9,8,10 |
9,10 |
н/д |
н/д |
SQL_C_BINARY(SQL_DATE_STRUCT) |
1,11 |
н/д |
н/д |
н/д |
н/д |
н/д |
н/д |
SQL_C_BINARY(SQL_TIME_STRUCT) |
н/д |
н/д |
н/д |
н/д |
н/д |
н/д |
н/д |
SQL_C_BINARY(SQL_TIMESTAMP_STRUCT) |
н/д |
н/д |
н/д |
н/д |
н/д |
н/д |
н/д |
Расшифровка символов
Символ |
Смысл |
||||||
---|---|---|---|---|---|---|---|
- |
Преобразование не поддерживается. Создается запись диагностики с кодом SQLSTATE 07006 и сообщением «Нарушение атрибута ограниченного типа данных». |
||||||
1 |
Если переданы недопустимые данные, то создается запись диагностики с кодом SQLSTATE 22007 и сообщением «Недопустимый формат даты и времени». |
||||||
2 |
Поля времени должны содержать нули, иначе создается запись диагностики с кодом SQLSTATE 22008 и сообщением «Частичное усечение». |
||||||
3 |
Дробная часть секунд должна быть равна нулю, в противном случае создается запись диагностики с кодом SQLSTATE 22008 и сообщением «Частичное усечение». |
||||||
4 |
Компонент даты не учитывается. |
||||||
5 |
Часовой пояс устанавливается в соответствии с часовым поясом клиента. |
||||||
6 |
Время установлено в нуль. |
||||||
7 |
Дата устанавливается в текущую дату. |
||||||
8 |
Время приводится от часового пояса клиента ко времени в формате UTC. Если во время этого преобразования возникла ошибка, создается запись диагностики с кодом SQLSTATE 22008 и сообщением «Переполнение поля datetime». |
||||||
9 |
Строка проходит синтаксический анализ и преобразуется в значение типа date, datetime, datetimeoffset или времени, в зависимости от первого встреченного знака препинания и наличия остальных компонентов. Затем строка преобразуется в целевой тип согласно правилам, описанным в приведенной выше таблице для типа исходных данных, который выясняется в процессе анализа. Если во время синтаксического анализа обнаружена ошибка, то создается диагностическая запись с кодом SQLSTATE 22018 и сообщением «Недопустимое значение символа для спецификации преобразования». Для параметров типа datetime и smalldatetime, если значение года выходит за пределы допустимого диапазона, создается диагностическая запись с кодом SQLSTATE 22007 и сообщением «Недопустимый формат даты и времени». Значение datetimeoffset после преобразования во времени в формате UTC должно находиться в пределах диапазона, даже если преобразование во времени в формате UTC не требуется. Причина этого заключается в том, что поток табличных данных и сервер всегда нормализуют время в значениях datetimeoffset для времени в формате UTC, поэтому клиент должен проверять, что значение времени после преобразования во времени в формате UTC находится в пределах поддерживаемого диапазона. Если переданы недопустимые для поддерживаемого диапазона времени в формате UTC данные, то создается диагностическая запись с кодом SQLSTATE 22007 и сообщением «Недопустимый формат даты и времени». |
||||||
10 |
Если произошло усечение с потерей данных, то создается запись диагностики с кодом SQLSTATE 22008 и сообщением «Недопустимый формат времени». Эта ошибка также возникает в том случае, если значение выходит за пределы диапазона, который может быть представлен диапазоном времени в формате UTC, используемым сервером. |
||||||
11 |
Если байтовая длина данных не равна размеру структуры, нужной для данного типа SQL, то создается диагностическая запись с кодом SQLSTATE 22003 и сообщением «Значение числового параметра за пределами диапазона». |
||||||
12 |
Если байтовая длина данных равна 4 или 8, данные посылаются на сервер в необработанном формате потока табличных данных smalldatetime или datetime. Если байтовая длина данных в точности равна размеру структуры SQL_TIMESTAMP_STRUCT, данные преобразуются в формат потока табличных данных для типа datetime2. |
||||||
13 |
Если происходит усечение с потерей данных, то создается диагностическая запись с кодом SQLSTATE 22001 и сообщением «Строковые данные, усечение справа». Число разрядов для дробной секунды (масштаб) определяется размером целевого столбца согласно следующей таблице.
Однако для типа SQL_C_TYPE_TIMESTAMP, если доли секунды можно представить в трех разрядах без потери данных, и размер столбца больше или равен 23, для дробной доли секунды создаются ровно три разряда. Это поведение обеспечивает обратную совместимость с приложениями, разработанными в расчете на более старые драйверы ODBC. Для размеров столбцов, превышающих диапазон в таблице, подразумевается масштаб 9. Это преобразование должно учитывать доли секунд с точностью до девяти значащих цифр — максимум, поддерживаемый ODBC. Если для столбца установлен размер, равный нулю, в ODBC это означает неограниченный размер для символьных типов переменной длины (9 разрядов там, где не работает правило трех разрядов для типа SQL_C_TYPE_TIMESTAMP). Задать размер столбца, равный нулю, для символьных типов фиксированной длины будет ошибкой. |
||||||
Недоступно |
Существующий способ работы SQL Server 2005 и более ранних версий сохранен. |