Преобразования из SQL в C
В следующей таблице приводится список вопросов, которые следует учитывать при преобразовании типов даты-времени SQL Server в типы языка C.
Преобразования
SQL_C_DATE |
SQL_C_TIME |
SQL_C_TIMESTAMP |
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 |
1 |
1 |
1 |
SQL_WCHAR |
2,3,4,5 |
2,3,6,7,8 |
2,3,9,10,11 |
1 |
1 |
1 |
SQL_TYPE_DATE |
ОК |
12 |
13 |
14 |
16 |
16 |
SQL_SS_TIME2 |
12 |
8 |
15 |
17 |
16 |
16 |
SQL_TYPE_TIMESTAMP |
18 |
7,8 |
ОК |
19 |
16 |
16 |
SQL_SS_TIMESTAMPOFFSET |
18,22 |
7,8,20 |
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, значение возвращается так же, как в версии SQL Server 2000 и более ранних. Это соответствует формату потока табличных данных, что составляет 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 использует не текущую дату, а 1.1.1900.