Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Opcje SET Transact-SQL STATISTICS TIME oświadczeń i STATISTICS IO służą do uzyskania informacji pomagających w diagnozowaniu długotrwałych zapytań. Wcześniejsze wersje SQL Server również wspierały opcję SHOWPLAN do analizy planów zapytań. Aplikacja ODBC może ustawić te opcje, wykonując następujące instrukcje:
SQLExecDirect(hstmt, "SET SHOWPLAN ON", SQL_NTS);
SQLExecDirect(hstmt, "SET STATISTICS TIME ON", SQL_NTS90
);
SQLExecDirect(hstmt, "SET STATISTICS IO ON", SQL_NTS);
Gdy SETSET STATISTICS TIME lub SHOWPLAN są WŁĄCZONE SET , SQLExecute i SQLExecDirect zwracają SQL_SUCCESS_WITH_INFO, a wtedy aplikacja może pobrać SHOWPLAN lub STATISTICS TIME wydać, wywołując SQLGetDiagRec , aż zwróci SQL_NO_DATA. Każda linia danych SHOWPLAN wraca w formacie:
szSqlState="01000", *pfNativeError=6223,
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]
Table Scan"
SQL Server w wersji 7.0 zastąpił opcję SHOWPLAN na SHOWPLAN_ALL i SHOWPLAN_TEXT, które zwracają wynik jako zestaw wyników, a nie zestaw komunikatów.
Każda linijka wraca STATISTICS TIME w formacie:
szSqlState="01000", *pfNativeError= 3613,
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]
SQL Server Parse and Compile Time: cpu time = 0 ms."
Wyjście z nie SETSET STATISTICS IO jest dostępne aż do końca zbioru wyników. Aby uzyskać STATISTICS IO wyjście, aplikacja wywołuje SQLGetDiagRec w momencie, gdy SQLFetch lub SQLFetchScroll zwracają SQL_NO_DATA. Wyjście z wraca STATISTICS IO w formacie:
szSqlState="01000", *pfNativeError= 3615,
szErrorMsg="[Microsoft][ SQL Server Native Client][SQL Server]
Table: testshow scan count 1, logical reads: 1,
physical reads: 0."
Używanie instrukcji DBCC
Instrukcje DBCC zwracają swoje dane jako wiadomości, a nie jako zbiory wyników. SQLExecDirect lub SQLExecute zwracają SQL_SUCCESS_WITH_INFO, a aplikacja pobiera wynik, wywołując SQLGetDiagRec , aż zwróci SQL_NO_DATA.
Na przykład następujące polecenie zwraca SQL_SUCCESS_WITH_INFO:
SQLExecDirect(hstmt, "DBCC CHECKTABLE(Authors)", SQL_NTS);
Calls to SQLGetDiagRec return:
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."
Używanie instrukcji PRINT i RAISERROR
Transact-SQL poleceń PRINT i RAISERROR również zwracają dane poprzez wywołanie SQLGetDiagRec. Instrukcje PRINT powodują, że wykonanie instrukcji SQL zwraca SQL_SUCCESS_WITH_INFO, a kolejne wywołanie SQLGetDiagRec zwraca wartość SQLState 01000. RAISERROR o nasileniu dziesięć lub niższym zachowuje się tak samo jak PRINT. RAISERROR o sile 11 lub wyższej powoduje zwrot wykonania SQL_ERROR, a kolejne wywołanie SQLGetDiagRec zwraca SQLState 42000. Na przykład następujące polecenie zwraca SQL_SUCCESS_WITH_INFO:
SQLExecDirect (hstmt, "PRINT 'Some message' ", SQL_NTS);
Wywołanie SQLGetDiagRec zwraca:
szSQLState = "01000", *pfNative Error = 0,
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]
Some message"
Następujące zdanie zwraca SQL_SUCCESS_WITH_INFO:
SQLExecDirect (hstmt, "RAISERROR ('Sample error 1.', 10, -1)",
SQL_NTS)
Wywołanie SQLGetDiagRec zwraca:
szSQLState = "01000", *pfNative Error = 50000,
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]
Sample error 1."
Następujące oświadczenie zwraca SQL_ERROR:
SQLExecDirect (hstmt, "RAISERROR ('Sample error 2.', 11, -1)", SQL_NTS)
Wywołanie SQLGetDiagRec zwraca:
szSQLState = "42000", *pfNative Error = 50000,
szErrorMsg= "[Microsoft] [SQL Server Native Client][SQL Server]
Sample error 2."
Moment wywołania SQLGetDiagRec jest kluczowy, gdy w zbiorze wyników zawarte są wyniki wywołane z instrukcji PRINT lub RAISERROR. Wywołanie do SQLGetDiagRec w celu pobrania wyjścia PRINT lub RAISERROR musi być wykonane natychmiast po wydaniu SQL_ERROR lub SQL_SUCCESS_WITH_INFO. Jest to proste, gdy wykonywana jest tylko jedna instrukcja SQL, jak w powyższych przykładach. W takich przypadkach wywołanie do SQLExecDirect lub SQLExecute zwraca SQL_ERROR lub SQL_SUCCESS_WITH_INFO i wtedy można wywołać SQLGetDiagRec . Mniej proste jest obsługiwanie wyników partii instrukcji SQL lub wykonywanie procedur przechowywanych w SQL Server podczas pętli kodowania.
W takim przypadku SQL Server zwraca zestaw wyników dla każdego polecenia SELECT wykonanego w procedurze wsadowej lub przechowywanej. Jeśli partia lub procedura zawiera instrukcje PRINT lub RAISERROR, wyjście dla nich jest przeplatane z zestawami wyników instrukcji SELECT. Jeśli pierwszym poleceniem w partii lub procedurze jest PRINT lub RAISERROR, SQLExecute lub SQLExecDirect zwraca SQL_SUCCESS_WITH_INFO lub SQL_ERROR, a aplikacja musi wywołać SQLGetDiagRec , aż zwróci SQL_NO_DATA w celu pobrania informacji PRINT lub RAISERROR.
Jeśli polecenie PRINT lub RAISERROR pojawia się po instrukcji SQL (np. SELECT), to informacja PRINT lub RAISERROR jest zwracana, gdy SQLMoreResults pozycjonuje się na zbiorze wyników zawierającym błąd. SQLMoreResults zwraca SQL_SUCCESS_WITH_INFO lub SQL_ERROR w zależności od powagi wiadomości. Wiadomości są pobierane przez wywołanie SQLGetDiagRec , aż zwróci SQL_NO_DATA.