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


SQLDescribeParam

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

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

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

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

  • After 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 Native Client задает параметру ParameterSizePtr значение 0. Значения фактического размера возвращаются для стандартных параметров varchar.

Примечание

Если параметр уже был привязан к максимальному размеру (для параметров типа SQL_VARCHAR, SQL_VARBINARY или SQL_WVARCHAR), возвращается привязанный размер параметра, а не «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
Дата 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. Дополнительные сведения см. в статье Крупные типы User-Defined CLR (ODBC).

См. также:

Функция SQLDescribeParam
ODBC API Implementation Details