다음을 통해 공유


메시지를 생성하는 문 처리

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

Transact-SQL SET 문 옵션 STATISTICS TIME 및 STATISTICS IO는 장기 실행 쿼리를 진단하는 데 도움이 되는 정보를 가져오는 데 사용됩니다. 이전 버전의 SQL Server는 쿼리 계획을 분석하기 위한 SHOWPLAN 옵션도 지원합니다. ODBC 애플리케이션은 다음 문을 실행하여 이러한 옵션을 설정할 수 있습니다.

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

SET STATISTICS TIME 또는 SET SHOWPLAN이 ON이면 SQLExecuteSQLExecDirect는 SQL_SUCCESS_WITH_INFO 반환하고, 이때 애플리케이션은 SQL_NO_DATA 반환할 때까지 SQLGetDiagRec를 호출하여 SHOWPLAN 또는 STATISTICS TIME 출력을 검색할 수 있습니다. SHOWPLAN 데이터의 각 줄은 다음과 같은 형식으로 다시 제공됩니다.

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

SQL Server 버전 7.0은 SHOWPLAN 옵션을 메시지 집합이 아닌 결과 집합으로 반환하는 SHOWPLAN_ALL 및 SHOWPLAN_TEXT 대체했습니다.

STATISTICS TIME의 각 줄은 형식으로 돌아갑니다.

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

SET STATISTICS IO의 출력은 결과 집합이 끝날 때까지 사용할 수 없습니다. STATISTICS IO 출력을 가져오기 위해 애플리케이션은 SQLFetch 또는 SQLFetchScroll이 SQL_NO_DATA 반환할 때 SQLGetDiagRec를 호출합니다. STATISTICS IO의 출력은 다음과 같은 형식으로 다시 제공됩니다.

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

DBCC 문 사용

DBCC 문은 결과 집합이 아닌 메시지로 데이터를 반환합니다. SQLExecDirect 또는 SQLExecute는 SQL_SUCCESS_WITH_INFO 반환하고 애플리케이션은 SQL_NO_DATA 반환할 때까지 SQLGetDiagRec를 호출하여 출력을 검색합니다.

예를 들어 다음 문은 SQL_SUCCESS_WITH_INFO 반환합니다.

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

SQLGetDiagRec에 대한 호출은 다음을 반환합니다.

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."  

PRINT 및 RAISERROR 문 사용

Transact-SQL PRINT 및 RAISERROR 문은 SQLGetDiagRec를 호출하여 데이터를 반환합니다. PRINT 문을 사용하면 SQL 문 실행이 SQL_SUCCESS_WITH_INFO 반환되고 SQLGetDiagRec대한 후속 호출은 SQLState 01000을 반환합니다. 심각도가 10 이하인 RAISERROR는 PRINT와 동일하게 동작합니다. 심각도가 11 이상인 RAISERROR는 실행이 SQL_ERROR 반환하고 SQLGetDiagRec대한 후속 호출은 SQLState 42000을 반환합니다. 예를 들어 다음 문은 SQL_SUCCESS_WITH_INFO 반환합니다.

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

SQLGetDiagRec 호출은 다음을 반환합니다.

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

다음 문은 SQL_SUCCESS_WITH_INFO를 반환합니다.

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

SQLGetDiagRec 호출은 다음을 반환합니다.

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

다음 문은 SQL_ERROR를 반환합니다.

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

SQLGetDiagRec 호출은 다음을 반환합니다.

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

PRINT 또는 RAISERROR 문의 출력이 결과 집합에 포함되는 경우 SQLGetDiagRec를 호출하는 타이밍이 중요합니다. PRINT 또는 RAISERROR 출력을 검색하기 위한 SQLGetDiagRec 호출은 SQL_ERROR 또는 SQL_SUCCESS_WITH_INFO 받는 문 바로 후에 이루어져야 합니다. 위의 예에서와 같이 단일 SQL 문만 실행하는 경우에는 간단합니다. 이러한 경우 SQLExecDirect 또는 SQLExecute 호출은 SQL_ERROR 또는 SQL_SUCCESS_WITH_INFO 반환하고 SQLGetDiagRec를 호출할 수 있습니다. 코딩 루프에서 SQL 문 일괄 처리의 출력을 처리하거나 SQL Server 저장 프로시저를 실행할 때는 간단하지 않습니다.

이 경우 SQL Server는 일괄 처리 또는 저장 프로시저에서 실행되는 모든 SELECT 문에 대한 결과 집합을 반환합니다. 일괄 처리 또는 프로시저에 PRINT 또는 RAISERROR 문이 포함된 경우 SELECT 문 결과 집합에 이러한 문의 출력이 인터리브됩니다. 일괄 처리 또는 프로시저의 첫 번째 문이 PRINT 또는 RAISERROR인 경우 SQLExecute 또는 SQLExecDirect는 SQL_SUCCESS_WITH_INFO 또는 SQL_ERROR 반환하고 애플리케이션은 PRINT 또는 RAISERROR 정보를 검색하기 위해 SQL_NO_DATA 반환할 때까지 SQLGetDiagRec를 호출해야 합니다.

PRINT 또는 RAISERROR 문이 SQL 문(예: SELECT 문) 뒤에 오면 SQLMoreResults가 오류를 포함하는 결과 집합에 배치될 때 PRINT 또는 RAISERROR 정보가 반환됩니다. SQLMoreResults는 메시지의 심각도에 따라 SQL_SUCCESS_WITH_INFO 또는 SQL_ERROR 반환합니다. 메시지는 SQL_NO_DATA 반환될 때까지 SQLGetDiagRec를 호출하여 검색됩니다.

참고 항목

오류 및 메시지 처리