Procesar los resultados (ODBC)

Después de que una aplicación envía una instrucción SQL, SQL Server devuelve los datos resultantes como uno o varios conjuntos de resultados. Un conjunto de resultados es un conjunto de filas y columnas que coinciden con los criterios de la consulta. Las instrucciones SELECT, las funciones de catálogo y algunos procedimientos almacenados generan un conjunto de resultados que quedan disponibles para las aplicaciones en formato tabular. Si la instrucción SQL ejecutada es un procedimiento almacenado, un lote que contiene varios comandos o una instrucción SELECT que contiene palabras clave como COMPUTE o COMPUTE BY, habrá varios conjuntos de resultados que procesar.

Las funciones de catálogo de ODBC también pueden recuperar los datos. Por ejemplo, SQLColumns recupera datos acerca de las columnas del origen de datos. Estos conjuntos de resultados pueden contener ninguna o más filas.

Otras instrucciones SQL, como GRANT o REVOKE, no devuelven conjuntos de resultados. Para estas instrucciones, el código de retorno de SQLExecute o SQLExecDirect es normalmente la única indicación de que la instrucción se ha ejecutado correctamente.

Cada instrucción INSERT, UPDATE y DELETE devuelve un conjunto de resultados que contiene sólo el número de filas afectado por la modificación. Este recuento está disponible cuando la aplicación llama a SQLRowCount. Las aplicaciones ODBC 3.x deben llamar a SQLRowCount para recuperar el conjunto de resultados o a SQLMoreResults para cancelarlo. Cuando una aplicación ejecuta un lote o procedimiento almacenado que contiene varias instrucciones INSERT, UPDATE o DELETE, el conjunto de resultados de cada instrucción de modificación debe procesarse utilizando SQLRowCount o cancelarse utilizando SQLMoreResults. Estos recuentos se pueden cancelar incluyendo una instrucción SET NOCOUNT ON en el lote o procedimiento almacenado.

Transact-SQL incluye la instrucción SET NOCOUNT. Cuando la opción NOCOUNT está activada, SQL Server no devuelve los recuentos de las filas afectadas por una instrucción y SQLRowCount devuelve 0. La versión de controlador ODBC de SQL Server Native Client introduce una opción SQLGetStmtAttr específica del controlador, SQL_SOPT_SS_NOCOUNT_STATUS, para notificar si la opción NOCOUNT está activada o desactivada. Siempre que SQLRowCount devuelve 0, la aplicación debe probar SQL_SOPT_SS_NOCOUNT_STATUS. Si devuelve SQL_NC_ON, el valor de 0 en SQLRowCount sólo indica que SQL Server no ha devuelto un recuento de filas. Si devuelve SQL_NC_OFF, significa que NOCOUNT está desactivado y el valor de 0 en SQLRowCount indica que la instrucción no afectó a ninguna fila. Las aplicaciones no deben mostrar el valor de SQLRowCount cuando SQL_SOPT_SS_NOCOUNT_STATUS es SQL_NC_OFF. Los procedimientos almacenados o lotes de gran tamaño pueden contener varias instrucciones SET NOCOUNT de modo que los programadores no puedan suponer que SQL_SOPT_SS_NOCOUNT_STATUS sigue siendo constante. Se debe probar la opción cada vez que SQLRowCount devuelve 0.

Otras instrucciones Transact-SQL devuelven los datos en mensajes, en lugar de en conjuntos de resultados. Cuando el controlador ODBC de SQL Server Native Client recibe estos mensajes, devuelve SQL_SUCCESS_WITH_INFO para permitir que la aplicación detecte que hay mensajes informativos disponibles. La aplicación puede llamar después a SQLGetDiagRec para recuperar estos mensajes. Las instrucciones Transact-SQL que funcionan de esta manera son:

  • DBCC

  • SET SHOWPLAN (disponible con versiones anteriores de SQL Server)

  • SET STATISTICS

  • PRINT

  • RAISERROR

El controlador ODBC de SQL Server Native Client devuelve SQL_ERROR en un RAISERROR con una gravedad de 11 o superior. Si la gravedad del RAISERROR es 19 o superior, se interrumpe además la conexión.

Para procesar los conjuntos de resultados de una instrucción SQL, la aplicación:

  • Determina las características del conjunto de resultados.

  • Enlaza las columnas a variables de programa.

  • Recupera un valor único, una fila completa de valores o varias filas de valores.

  • Comprueba si hay más conjuntos de resultados y, en caso afirmativo, recorre de nuevo el bucle para determinar las características del nuevo conjunto de resultados.

El proceso de recuperar filas del origen de datos y devolverlas a la aplicación se denomina captura.

Recuperar conjuntos de resultados mediante COMPUTE y COMPUTE BY

La cláusula COMPUTE BY genera subtotales dentro de un conjunto de resultados; la cláusula COMPUTE genera un total al final del conjunto de resultados. El controlador ODBC de SQL Server Native Client presenta estos totales y subtotales a la aplicación que realiza la llamada generando varios conjuntos de resultados para cada instrucción SELECT.

En el ejemplo siguiente se utiliza COMPUTE BY para generar subtotales y COMPUTE para generar un total:

SELECT Title = CONVERT(char(20), title), type, price, advance
FROM Titles
WHERE ytd_sales IS NOT NULL
  AND type LIKE '%cook%'
ORDER BY type DESC
COMPUTE AVG(price), SUM(advance) BY type
COMPUTE SUM(price), SUM(advance)

Estas instrucciones producen el cálculo del subtotal del precio medio y la suma de los anticipos de cada tipo de libro y, a continuación, producen la suma total final del precio y de los datos de anticipo. El controlador presenta el primer conjunto de resultados de las filas de libros que tienen el primer tipo de libro. A continuación, genera un segundo conjunto de resultados con las dos columnas COMPUTY BY para AVG(price) y SUM(advance) para este primer conjunto de libros. A continuación, genera un tercer conjunto de resultados para el grupo siguiente de libros, y un cuarto conjunto de resultados con los subtotales de COMPUTE BY para ese grupo. El controlador intercala estos conjuntos de resultados hasta que genera el conjunto de resultados finales con el total de la cláusula COMPUTE SUM(price), SUM(advance).