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


Преобразования из 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.

См. также

Основные понятия