Преобразования из SQL в C
В следующей таблице приводится список вопросов, которые следует учитывать при преобразовании типов даты-времени SQL Server в типы языка C.
Преобразования
SQL_C_DATE |
SQL_C_TIME |
SQL_C_TIMESTAMP |
SQL_C_SS_TIME2 |
SQL_C_SS_TIMESTAMPOFFSET |
SQL_C_BINARY |
SQL_C_CHAR |
SQL_C_WCHAR |
|
SQL_CHAR |
2,3,4,5 |
2,3,6,7,8 |
2,3,9,10,11 |
2,3,6,7 |
2,3,9,10,11 |
1 |
1 |
1 |
SQL_WCHAR |
2,3,4,5 |
2,3,6,7,8 |
2,3,9,10,11 |
2,3,6,7 |
2,3,9,10,11 |
1 |
1 |
1 |
SQL_TYPE_DATE |
ОК |
12 |
13 |
12 |
13,23 |
14 |
16 |
16 |
SQL_SS_TIME2 |
12 |
8 |
15 |
ОК |
10,23 |
17 |
16 |
16 |
SQL_TYPE_TIMESTAMP |
18 |
7,8 |
ОК |
7 |
23 |
19 |
16 |
16 |
SQL_SS_TIMESTAMPOFFSET |
18,22 |
7,8,20 |
20 |
7,20 |
ОК |
21 |
16 |
16 |
Расшифровка символов
Символ |
Смысл |
---|---|
ОК |
Проблемы преобразования отсутствуют. |
1 |
Применяются правила, использовавшиеся до SQL Server 2008. |
2 |
Начальные и конечные пробелы пропускаются. |
3 |
Выполняется синтаксический анализ строки, при котором из нее извлекается дата, время, часовой пояс или смещение часового пояса, при этом допускается точность задания долей секунды до 9 десятичных знаков. Если при анализе обнаруживается смещение часового пояса, то время преобразуется к часовому поясу клиента. Если во время преобразования возникла ошибка, то создается запись диагностики с кодом SQLSTATE 22018 и сообщением «Переполнение поля Datetime». |
4 |
Если значение не является действительной датой, отметкой времени или значением timestampoffset, то формируется диагностическая запись с ошибкой SQLSTATE 22018 и сообщением «Недопустимое символьное значение для спецификации приведения». |
5 |
Если значение времени не равно нулю, то создается запись диагностики с кодом SQLSTATE 01S07 и сообщением «Частичное усечение». |
6 |
Если значение не является действительным значением времени, отметкой времени или значением timestampoffset, то формируется диагностическая запись с ошибкой SQLSTATE 22018 и сообщением «Недопустимое символьное значение для спецификации приведения». |
7 |
Компонент даты не учитывается. |
8 |
Если значение долей секунды не равно нулю, то создается диагностическая запись с кодом SQLSTATE 01S07 и сообщением «Частичное усечение». |
9 |
Если значение не является действительным значением даты, времени, отметкой времени или значением timestampoffset, то формируется диагностическая запись с ошибкой SQLSTATE 22018 и сообщением «Недопустимое символьное значение для спецификации приведения». |
10 |
Если значение является действительным значением времени, то компонент даты принимает значение текущей даты на стороне клиента. |
11 |
Если значение является действительным значением даты, то для времени устанавливается значение, равное нулю. |
12 |
Создается запись диагностики с кодом SQLSTATE 07006 и сообщением «Нарушение атрибута ограниченного типа данных». |
13 |
Время установлено в нуль. |
14 |
Если буфер недостаточно велик для значения SQL_DATE_STRUCT, то формируется диагностическая запись с ошибкой SQLSTATE 22003 и сообщением «Численное значение вне допустимого диапазона». |
15 |
Дата устанавливается равной текущей дате на стороне клиента. |
16 |
Если буфер недостаточно велик для преобразованного строкового значения, но не помещается только дробное значение секунд, то происходит усечение долей секунд и формируется диагностическая запись с ошибкой SQLSTATE 01004 и сообщением «Строковые данные, усечение справа». Если буфер недостаточно велик для помещения строкового значения без усечения компонентов даты, времени или смещения, то формируется диагностическая запись с ошибкой SQLSTATE 22003 и сообщением «Численное значение вне допустимого диапазона». Учтите, что для значений типа timestampoffset и значений даты невозможна ошибка SQLSTATE 01004, поскольку крайняя правая часть преобразованной строки не содержит долей секунды. Поэтому при любом усечении неизбежна потеря данных. |
17 |
Если буфер недостаточно велик для значения SQL_SS_TIME2_STRUCT, то формируется диагностическая запись с ошибкой SQLSTATE 22003 и сообщением «Численное значение вне допустимого диапазона». |
18 |
Если значение времени не равно нулю, то создается запись диагностики с кодом SQLSTATE 01S07 и сообщением «Частичное усечение». |
19 |
Если серверный тип — datetime или smalldatetime, то значение соответствует формату потока табличных данных и будет 4-байтовым значением для smalldatetime или 8-байтовым для datetime. Если типом данных на стороне сервера является datetime2, то значение возвращается в виде SQL_TIMESTAMP_STRUCT. Если буфер недостаточно велик для возвращенного значения, то формируется диагностическая запись с ошибкой SQLSTATE 22003 и сообщением «Численное значение вне допустимого диапазона». |
20 |
Время приводится к часовому поясу клиента. Если во время преобразования возникла ошибка, то создается запись диагностики с кодом SQLSTATE 22008 и сообщением «Переполнение поля Datetime». |
21 |
Если буфер недостаточно велик для значения SQL_SS_TIMESTAMPOFFSET_STRUCT, то значение возвращается в виде SQL_SS_TIMESTAMPOFFSET_STRUCT. В противном случае формируется диагностическая запись с ошибкой SQLSTATE 22003 и сообщением «Численное значение вне допустимого диапазона». |
22 |
Это значение приводится к часовому поясу клиента до извлечения даты. Тем самым обеспечивается согласованность с другими преобразованиями с типами timestampoffset. Если во время преобразования возникла ошибка, то создается запись диагностики с кодом SQLSTATE 22008 и сообщением «Переполнение поля Datetime». В результате может быть получена дата, отличающаяся от значения, получаемого простым усечением. |
Таблица в этом разделе описывает преобразования между типами, возвращаемыми клиенту, и типами в привязке. Для выходных параметров, если серверный тип, заданный в SQLBindParameter, не соответствует фактическому типу на сервере, то сервер выполняет неявное преобразование, и возвращаемый клиенту тип будет соответствовать указанному в SQLBindParameter типу. Это может привести к непредвиденным результатам преобразования, если правила преобразования сервера отличаются от правил, приведенных в предыдущей таблице. Например, если необходима дата по умолчанию, SQL Server использует не текущую дату, а 01.01.1900.