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


SQLDescribeParam

Для описания параметров любой инструкции SQL драйвер ODBC для собственного клиента SQL Server строит и выполняет инструкцию Transact-SQL SELECT при вызове функции SQLDescribeParam в дескрипторе подготовленной инструкции ODBC. Метаданные результирующего набора определяют характеристики параметров в подготовленной инструкции. SQLDescribeParam может возвратить любой код ошибки, который способен возвратить функции SQLExecute и SQLExecDirect.

Улучшения ядра СУБД, появившиеся с версии SQL Server 2012, позволяют SQLDescribeParam получать более точные описания ожидаемых результатов. Такие более точные результаты могут отличаться от значений, которые SQLDescribeParam возвращает в предыдущих версиях SQL Server. Дополнительные сведения см. в разделе Обнаружение метаданных.

Кроме того, новым в SQL Server 2012 является то, что ParameterSizePtr теперь возвращает значение, соответствующее определению размера, символов, столбца и выражения соответствующего маркера параметра, которое приведено в Спецификации ODBC. В предыдущих версиях собственного клиента SQL Server параметр ParameterSizePtr мог иметь соответствующее значение типа SQL_DESC_OCTET_LENGTH или несоответствующее значение размера столбца, которое передавалось в SQLBindParameter в качестве типа, значение которого не следовало учитывать (например, SQL_INTEGER).

Драйвер не поддерживает вызов функции SQLDescribeParam в следующих случаях.

  • После вызова SQLExecDirect для любой из инструкций Transact-SQL UPDATE или DELETE, содержащих предложение FROM.

  • Для любой инструкции ODBC или Transact-SQL, содержащей параметр в предложении HAVING, или сравниваемой с результатом функции SUM.

  • Для любой инструкции ODBC или Transact-SQL, зависящей от вложенного запроса, который содержит параметры.

  • Для инструкций ODBC SQL, содержащих маркеры параметров в обоих сравниваемых выражениях или содержащих предикат с квантором.

  • Для любых запросов, в которых один из параметров является параметром функции.

  • Когда в команде Transact-SQL присутствуют комментарии (/* */).

При обработке пакета инструкций Transact-SQL драйвер также не поддерживает вызов функции SQLDescribeParam для маркеров параметров в выражениях после обработки первой инструкции в пакете.

При описании параметров подготовленных хранимых процедур функция SQLDescribeParam использует системную хранимую процедуру sp_sproc_columns для получения характеристик параметра. Процедура sp_sproc_columns может передать данные для хранимых процедур внутри текущей базы данных пользователя. Подготовка полного имени хранимой процедуры позволяет функции SQLDescribeParam выполняться в нескольких базах данных. Например, системная хранимая процедура sp_who может быть подготовлена и выполнена в любой базе данных следующим образом:

SQLPrepare(hstmt, "{call sp_who(?)}", SQL_NTS);

Выполнение функции SQLDescribeParam после удачной подготовки возвращает пустой набор строк при соединении с любой базой данных, за исключением master. Тот же вызов, подготовленный следующим образом, приведет к удачному завершению функции SQLDescribeParam независимо от текущей базы данных пользователя:

SQLPrepare(hstmt, "{call master..sp_who(?)}", SQL_NTS);

Для типов данных больших значений, возвращаемым в DataTypePtr, значением является SQL_VARCHAR, SQL_VARBINARY или SQL_NVARCHAR. Чтобы указать, что размер параметра типа данных больших значений является «неограниченным», драйвер ODBC собственного клиента SQL Server задает параметру ParameterSizePtr значение 0. Значения фактического размера возвращаются для стандартных параметров varchar.

ПримечаниеПримечание

Если параметр уже был привязан к максимальному размеру (для параметров типа SQL_VARCHAR, SQL_VARBINARY или SQL_WVARCHAR), возвращается привязанный размер параметра, а не «unlimited».

Чтобы привязать входной параметр размера «unlimited», необходимо использовать данные времени выполнения. Нельзя привязать выходной параметр размера «unlimited» (нет метода для потоковой передачи данных из выходного параметра, как делает функция SQLGetData для результирующих наборов).

Для выходных параметров буфер должен быть привязан, и, если значение слишком длинное, буфер заполняется, и возвращается сообщение SQL_SUCCESS_WITH_INFO с предупреждением «строковые данные; усечение справа». Данные, которые были усечены, затем отбрасываются.

Функция SQLDescribeParam и возвращающие табличные значения параметры

Приложение может получить сведения о возвращающем табличное значение параметре для подготовленной инструкции при помощи функции SQLDescribeParam. Дополнительные сведения см. в разделе Метаданные возвращающего табличное значение параметра для подготовленных инструкций.

Дополнительные общие сведения о возвращающих табличное значение параметрах см. в разделе Возвращающие табличное значение параметры (ODBC).

Поддержка в функции SQLDescribeParam улучшенных возможностей даты-времени

Для типов даты-времени возвращаются следующие значения.

DataTypePtr

ParameterSizePtr

DecimalDigitsPtr

datetime

SQL_TYPE_TIMESTAMP

23

3

smalldatetime

SQL_TYPE_TIMESTAMP

16

0

date

SQL_TYPE_DATE

10

0

time

SQL_SS_TIME2

8, 10..16

0..7

datetime2

SQL_TYPE_TIMESTAMP

19, 21..27

0..7

datetimeoffset

SQL_SS_TIMESTAMPOFFSET

26, 28..34

0..7

Дополнительные сведения см. в разделе Улучшенная обработка даты и времени (ODBC).

Поддержка в функции SQLDescribeParam определяемых пользователем типов больших данных CLR

Функция SQLDescribeParam поддерживает определяемые пользователем типы больших данных CLR. Дополнительные сведения см. в разделе Определяемые пользователем типы данных больших значений CLR (ODBC).

См. также

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

Подробности реализации API-интерфейса ODBC

Другие ресурсы

Функция SQLDescribeParam