SQLDescribeParam
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 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, 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 y como se define en la especificación ODBC. En versiones anteriores de SQL Server Native Client, ParameterSizePtr podría ser el valor correspondiente del SQL_DESC_OCTET_LENGTH
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 cualquier instrucción UPDATE o DELETE de Transact-SQL que contenga 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 marcadores de parámetros 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 se conecta a cualquier base de datos, pero master
. 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 gran valor, 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. En los parámetros varchar
estándar se devuelven los valores de tamaño reales.
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 para 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:
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 CLR definidos por el usuario (UDT) grandes. Para obtener más información, vea Large CLR User-Defined Types (ODBC).