Procesar instrucciones que generan mensajes

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

La Transact-SQL SET opciones STATISTICS TIME de sentencias y STATISTICS IO se utiliza para obtener información que ayuda a diagnosticar consultas de larga duración. Las versiones anteriores de SQL Server también admiten la opción SHOWPLAN para analizar planes de consulta. Una aplicación ODBC puede establecer estas opciones ejecutando las instrucciones siguientes:

SQLExecDirect(hstmt, "SET SHOWPLAN ON", SQL_NTS);  
SQLExecDirect(hstmt, "SET STATISTICS TIME ON", SQL_NTS90  
);  
SQLExecDirect(hstmt, "SET STATISTICS IO ON", SQL_NTS);  

Cuando SETSET STATISTICS TIME o SET SHOWPLAN están ACTIVADOS, SQLExecute y SQLExecDirect devuelven SQL_SUCCESS_WITH_INFO y, en ese momento, la aplicación puede recuperar el SHOWPLAN o STATISTICS TIME la salida llamando a SQLGetDiagRec hasta que devuelva SQL_NO_DATA. Cada línea de datos de SHOWPLAN se devuelve en el formato:

szSqlState="01000", *pfNativeError=6223,  
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]   
              Table Scan"  

SQL Server versión 7.0 reemplazó la opción SHOWPLAN por SHOWPLAN_ALL y SHOWPLAN_TEXT, ambos los cuales devuelven la salida como un conjunto de resultados, no como un conjunto de mensajes.

Cada línea de STATISTICS TIME vuelve en el formato:

szSqlState="01000", *pfNativeError= 3613,  
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]  
   SQL Server Parse and Compile Time: cpu time = 0 ms."  

La salida de SETSET STATISTICS IO no está disponible hasta el final de un conjunto de resultados. Para obtener STATISTICS IO la salida, la aplicación llama a SQLGetDiagRec en el momento en que SQLFetch o SQLFetchScroll devuelven SQL_NO_DATA. La salida de STATISTICS IO vuelve en el formato:

szSqlState="01000", *pfNativeError= 3615,  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   Table: testshow  scan count 1,  logical reads: 1,  
   physical reads: 0."  

Utilizar instrucciones DBCC

Las instrucciones DBCC devuelven los datos como mensajes, no como conjuntos de resultados. SQLExecDirect o SQLExecute devuelven SQL_SUCCESS_WITH_INFO y la aplicación recupera la salida llamando a SQLGetDiagRec hasta que devuelva SQL_NO_DATA.

Por ejemplo, la instrucción siguiente devuelve SQL_SUCCESS_WITH_INFO:

SQLExecDirect(hstmt, "DBCC CHECKTABLE(Authors)", SQL_NTS);  

Las llamadas a SQLGetDiagRec devuelven:

szSqlState = "01000", *pfNativeError = 2536,  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   Checking authors"  
szSqlState = "01000", *pfNativeError = 2579,  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   The total number of data pages in this table is 1."  
szSqlState = "01000", *pfNativeError = 7929,  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   Table has 23 data rows."  
szSqlState = "01000", *pfNativeError = 2528  
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]  
   DBCC execution completed. If DBCC printed error messages,  
   see your System Administrator."  

Utilizar instrucciones RAISERROR y PRINT

Las instrucciones PRINT y RAISERROR de Transact-SQL también devuelven datos mediante una llamada a SQLGetDiagRec. Las instrucciones PRINT hacen que la ejecución de la instrucción SQL devuelva SQL_SUCCESS_WITH_INFO y una llamada posterior a SQLGetDiagRec devuelve un valor SQLState de 01000. Un RAISERROR con una gravedad de diez o inferior se comporta igual que PRINT. Un RAISERROR con una gravedad de 11 o superior hace que la ejecución devuelva SQL_ERROR y una llamada posterior a SQLGetDiagRec devuelve SQLState 42000. Por ejemplo, la instrucción siguiente devuelve SQL_SUCCESS_WITH_INFO:

SQLExecDirect (hstmt, "PRINT  'Some message' ", SQL_NTS);  

Llamar a SQLGetDiagRec devuelve:

szSQLState = "01000", *pfNative Error = 0,  
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]  
   Some message"  

La instrucción siguiente devuelve SQL_SUCCESS_WITH_INFO:

SQLExecDirect (hstmt, "RAISERROR ('Sample error 1.', 10, -1)",  
   SQL_NTS)  

Llamar a SQLGetDiagRec devuelve:

szSQLState = "01000", *pfNative Error = 50000,  
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]  
   Sample error 1."  

La siguiente instrucción devuelve SQL_ERROR.

SQLExecDirect (hstmt, "RAISERROR ('Sample error 2.', 11, -1)", SQL_NTS)  

Llamar a SQLGetDiagRec devuelve:

szSQLState = "42000", *pfNative Error = 50000,  
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]  
   Sample error 2."  

El tiempo de llamada a SQLGetDiagRec es fundamental cuando la salida de las instrucciones PRINT o RAISERROR se incluye en un conjunto de resultados. La llamada a SQLGetDiagRec para recuperar la salida PRINT o RAISERROR debe realizarse inmediatamente después de la instrucción que recibe SQL_ERROR o SQL_SUCCESS_WITH_INFO. Esto es sencillo cuando solo se ejecuta una instrucción SQL única, como en los ejemplos anteriores. En estos casos, se puede llamar a la llamada a SQLExecDirect o SQLExecute SQL_ERROR o SQL_SUCCESS_WITH_INFO y SQLGetDiagRec. Es menos sencillo al codificar bucles para controlar la salida de un lote de instrucciones SQL o al ejecutar procedimientos almacenados de SQL Server.

En este caso, SQL Server devuelve un conjunto de resultados para cada instrucción SELECT ejecutada en un lote o procedimiento almacenado. Si el lote o procedimiento contiene instrucciones RAISERROR o PRINT, la salida de éstas se intercala con los conjuntos de resultados de la instrucción SELECT. Si la primera instrucción del lote o procedimiento es PRINT o RAISERROR, SQLExecute o SQLExecDirect devuelve SQL_SUCCESS_WITH_INFO o SQL_ERROR, y la aplicación debe llamar a SQLGetDiagRec hasta que devuelva SQL_NO_DATA para recuperar la información PRINT o RAISERROR.

Si la instrucción PRINT o RAISERROR viene después de una instrucción SQL (como una instrucción SELECT), la información PRINT o RAISERROR se devuelve cuando SQLMoreResults coloca en el conjunto de resultados que contiene el error. SQLMoreResults devuelve SQL_SUCCESS_WITH_INFO o SQL_ERROR en función de la gravedad del mensaje. Los mensajes se recuperan llamando a SQLGetDiagRec hasta que devuelve SQL_NO_DATA.

Consulte también

Controlar errores y mensajes