Compartir a través de


SQLDescribeParam

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Para describir los parámetros de cualquier instrucción SQL, el controlador ODBC de SQL Server Native Client compila y ejecuta una instrucción SELECT de Transact-SQL cuando se llama a SQLDescribeParam en un identificador de instrucción ODBC preparado. Los metadatos del conjunto de resultados determinan las características de los parámetros en la instrucción preparada. SQLDescribeParam puede devolver cualquier código de error que SQLExecute o SQLExecDirect pueda devolver.

Las mejoras en el motor de base de datos a partir de SQL Server 2012 (11.x) permiten a SQLDescribeParam obtener descripciones más precisas de los resultados esperados. Estos resultados más precisos pueden diferir de los valores devueltos por SQLDescribeParam en versiones anteriores de SQL Server. Para obtener más información, vea Detección de metadatos.

Novedades también en SQL Server 2012 (11.x), ParameterSizePtr ahora devuelve un valor que se alinea con la definición del tamaño, en caracteres, de la columna o expresión del marcador de parámetro correspondiente, tal como se define en la especificación ODBC. En versiones anteriores de SQL Server Native Client, ParameterSizePtr podría ser el valor correspondiente de SQL_DESC_OCTET_LENGTH para el tipo, o un valor de tamaño de columna irrelevante que se proporcionó a SQLBindParameter para un tipo, cuyo valor debe omitirse (SQL_INTEGER, por ejemplo).

El controlador no admite la llamada a SQLDescribeParam en las situaciones siguientes:

  • Después de SQLExecDirect para las instrucciones TRANSACT-SQL UPDATE o DELETE que contengan la cláusula FROM.

  • Para cualquier instrucción ODBC o Transact-SQL que contenga un parámetro en una cláusula HAVING o en comparación con el resultado de una función SUM.

  • Para cualquier instrucción ODBC o Transact-SQL en función de una subconsulta que contenga parámetros.

  • En instrucciones ODBC SQL que contengan marcadores de parámetros en ambas expresiones de una comparación, igualdad o predicado cuantificado.

  • En cualquier consulta donde uno de los parámetros sea un parámetro a una función.

  • Cuando hay comentarios (/* */) en el comando Transact-SQL.

Al procesar un lote de instrucciones Transact-SQL, el controlador tampoco admite llamar a SQLDescribeParam para los marcadores de parámetro en instrucciones después de la primera instrucción del lote.

Al describir los parámetros de los procedimientos almacenados preparados, SQLDescribeParam usa el procedimiento almacenado del sistema sp_sproc_columns para recuperar las características de los parámetros. sp_sproc_columns puede informar de los datos de los procedimientos almacenados dentro de la base de datos de usuario actual. La preparación de un nombre de procedimiento almacenado completo permite que SQLDescribeParam se ejecute entre bases de datos. Por ejemplo, el procedimiento almacenado del sistema sp_who se puede preparar y ejecutar en cualquier base de datos como:

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

La ejecución de SQLDescribeParam después de la preparación correcta devuelve un conjunto de filas vacío cuando está conectado a cualquier base de datos, pero maestra. La misma llamada, preparada como se indica a continuación, hace que SQLDescribeParam se realice correctamente independientemente de la base de datos de usuario actual:

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

Para los tipos de datos de valores grandes, el valor devuelto en DataTypePtr es SQL_VARCHAR, SQL_VARBINARY o SQL_NVARCHAR. Para indicar que el tamaño del parámetro de tipo de datos de valor grande es "ilimitado", el controlador ODBC de SQL Server Native Client establece ParameterSizePtr en 0. Los valores de tamaño real se devuelven para los parámetros varchar estándar.

Nota:

Si el parámetro ya se ha enlazado con un tamaño máximo para los parámetros SQL_VARCHAR, SQL_WVARCHAR o SQL_VARBINARY, se devuelve el tamaño enlazado del parámetro, no "ilimitado".

Para enlazar un parámetro de entrada de tamaño "ilimitado", se deben utilizar datos en ejecución. No es posible enlazar un parámetro de salida de tamaño "ilimitado" (no hay ningún método para transmitir datos desde un parámetro de salida, como SQLGetData hace para los conjuntos de resultados).

Para los parámetros de salida se debe enlazar un búfer y, si el valor es demasiado grande, el búfer se rellena y se devuelve un mensaje SQL_SUCCESS_WITH_INFO junto con la advertencia "Datos tipo String, se truncarán por la derecha". Los datos truncados se descartan.

SQLDescribeParam y parámetros con valores de tabla

Una aplicación puede recuperar información de parámetros con valores de tabla para una instrucción preparada con SQLDescribeParam. Para obtener más información, vea Metadatos de parámetros con valores de tabla para instrucciones preparadas.

Para obtener más información sobre los parámetros con valores de tabla en general, vea Parámetros con valores de tabla (ODBC).

SQLDescribeParam admite las características mejoradas de fecha y hora

Los valores devueltos para los tipos de fecha y hora son los siguientes:

Attribute 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

Para obtener más información, vea Mejoras de fecha y hora (ODBC).

SQLDescribeParam admite UDT CLR grandes

SQLDescribeParam admite tipos definidos por el usuario (UDT) clR grandes. Para obtener más información, vea Tipos definidos por el usuario (ODBC) clR grandes.

Consulte también

Función SQLDescribeParam
Detalles de implementación de la API de ODBC