다음을 통해 공유


메시지를 생성하는 문 처리

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

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가 호출되는 시점이 중요합니다. SQL_ERROR 또는 SQL_SUCCESS_WITH_INFO를 검색하는 문 바로 다음에 SQLGetDiagRec를 호출하여 PRINT 또는 RAISERROR 출력을 검색해야 합니다. 위의 예에서와 같이 단일 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 문) 다음에 오는 경우 PRINT 또는 RAISERROR 정보는 오류를 포함하는 결과 집합에 SQLMoreResults가 배치될 때 반환됩니다. SQLMoreResults는 메시지의 심각도에 따라 SQL_SUCCESS_WITH_INFO 또는 SQL_ERROR를 반환합니다. 메시지를 검색하려면 SQL_NO_DATA가 반환될 때까지 SQLGetDiagRec를 호출합니다.

참고 항목

개념

오류 및 메시지 처리