Bagikan melalui


Memproses Pernyataan yang Menghasilkan Pesan

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Opsi pernyataan SET Transact-SQL STATISTICS TIME dan STATISTICS IO digunakan untuk mendapatkan informasi yang membantu dalam mendiagnosis kueri yang berjalan lama. Versi SQL Server yang lebih lama juga mendukung opsi SHOWPLAN untuk menganalisis rencana kueri. Aplikasi ODBC dapat mengatur opsi ini dengan menjalankan pernyataan berikut:

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

Ketika SET STATISTICS TIME atau SET SHOWPLAN AKTIF, SQLExecute dan SQLExecDirect mengembalikan SQL_SUCCESS_WITH_INFO, dan, pada saat itu, aplikasi dapat mengambil output SHOWPLAN atau STATISTICS TIME dengan memanggil SQLGetDiagRec sampai kembali SQL_NO_DATA. Setiap baris data SHOWPLAN kembali dalam format:

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

SQL Server versi 7.0 mengganti opsi SHOWPLAN dengan SHOWPLAN_ALL dan SHOWPLAN_TEXT, yang keduanya mengembalikan output sebagai kumpulan hasil, bukan sekumpulan pesan.

Setiap baris STATISTICS TIME kembali dalam format:

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

Output SET STATISTICS IO tidak tersedia hingga akhir tataan hasil. Untuk mendapatkan output STATISTICS IO, aplikasi memanggil SQLGetDiagRec pada saat SQLFetch atau SQLFetchScroll mengembalikan SQL_NO_DATA. Output STATISTICS IO kembali dalam format:

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

Menggunakan Pernyataan DBCC

Pernyataan DBCC mengembalikan data mereka sebagai pesan, bukan tataan hasil. SQLExecDirect atau SQLExecute mengembalikan SQL_SUCCESS_WITH_INFO, dan aplikasi mengambil output dengan memanggil SQLGetDiagRec hingga kembali SQL_NO_DATA.

Misalnya, pernyataan berikut mengembalikan SQL_SUCCESS_WITH_INFO:

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

Panggilan ke pengembalian 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."  

Menggunakan Pernyataan PRINT dan RAISERROR

Pernyataan Transact-SQL PRINT dan RAISERROR juga mengembalikan data dengan memanggil SQLGetDiagRec. Pernyataan PRINT menyebabkan eksekusi pernyataan SQL mengembalikan SQL_SUCCESS_WITH_INFO, dan panggilan berikutnya ke SQLGetDiagRec mengembalikan SQLState 01000. RAISERROR dengan tingkat keparahan sepuluh atau lebih rendah bertingkah sama dengan PRINT. RAISERROR dengan tingkat keparahan 11 atau lebih tinggi menyebabkan eksekusi mengembalikan SQL_ERROR, dan panggilan berikutnya ke SQLGetDiagRec mengembalikan SQLState 42000. Misalnya, pernyataan berikut mengembalikan SQL_SUCCESS_WITH_INFO:

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

Memanggil SQLGetDiagRec mengembalikan:

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

Pernyataan berikut mengembalikan SQL_SUCCESS_WITH_INFO:

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

Memanggil SQLGetDiagRec mengembalikan:

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

Pernyataan berikut mengembalikan SQL_ERROR:

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

Memanggil SQLGetDiagRec mengembalikan:

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

Waktu panggilan SQLGetDiagRec sangat penting ketika output dari pernyataan PRINT atau RAISERROR disertakan dalam kumpulan hasil. Panggilan ke SQLGetDiagRec untuk mengambil output PRINT atau RAISERROR harus dilakukan segera setelah pernyataan yang menerima SQL_ERROR atau SQL_SUCCESS_WITH_INFO. Ini mudah ketika hanya satu pernyataan SQL yang dijalankan, seperti pada contoh di atas. Dalam kasus ini, panggilan ke SQLExecDirect atau SQLExecute mengembalikan SQL_ERROR atau SQL_SUCCESS_WITH_INFO dan SQLGetDiagRec kemudian dapat dipanggil. Ini kurang mudah ketika mengodekan perulangan untuk menangani output batch pernyataan SQL atau saat menjalankan prosedur tersimpan SQL Server.

Dalam hal ini, SQL Server mengembalikan hasil yang ditetapkan untuk setiap pernyataan SELECT yang dijalankan dalam prosedur batch atau tersimpan. Jika batch atau prosedur berisi pernyataan PRINT atau RAISERROR, output untuk ini diselingi dengan kumpulan hasil pernyataan SELECT. Jika pernyataan pertama dalam batch atau prosedur adalah PRINT atau RAISERROR, SQLExecute atau SQLExecDirect mengembalikan SQL_SUCCESS_WITH_INFO atau SQL_ERROR, dan aplikasi perlu memanggil SQLGetDiagRec hingga kembali SQL_NO_DATA untuk mengambil informasi PRINT atau RAISERROR.

Jika pernyataan PRINT atau RAISERROR muncul setelah pernyataan SQL (seperti pernyataan SELECT), informasi PRINT atau RAISERROR dikembalikan ketika SQLMoreResults memosisikan pada kumpulan hasil yang berisi kesalahan. SQLMoreResults mengembalikan SQL_SUCCESS_WITH_INFO atau SQL_ERROR tergantung pada tingkat keparahan pesan. Pesan diambil dengan memanggil SQLGetDiagRec hingga kembali SQL_NO_DATA.

Lihat Juga

Menangani Kesalahan dan Pesan