SQL Profiler是個好東西。極大的方便了我們查看SQL語句的執行情況,也能協助我們瞭解SQL的很多內部狀態。那麼除了運行SQL Profiler就沒有其他方法可以實現了嗎?當然不會,這裡提供一個簡單的樣本以示說明:
1. 使用系統預存程序sp_trace_create建立一個Trace,這個SP可以在on-line help上找到
DECLARE @TraceIdOut int, @On bit, @rc int
-- Define the trace
exec @rc = sp_trace_create @TraceIdOut OUTPUT, 2, N'c:/sqlauditfile1' --最後一個參數是最終Trace結果存放的位置
print @TraceIdOut --列印Trace ID的目的是當需要停止該Trace時好知道該挺哪個
2. 使用系統預存程序sp_trace_setevent告知SQL所要監聽的事件以及事件返回的資訊,同樣具體參數參看on-line help
SET @On = 1
exec sp_trace_setevent @TraceIdOut, 13, 1, @On --最後一個參數表明開始監聽,這裡很是奇特,該參數是bit型,但是直接傳1不行,必須是一個bit型的變數。。。
--這個例子監聽的是SQL:BatchCompleted事件,返回的是SQL最終執行的語句(TextData)
--如果想監聽多個事件,或者需要返回多個資訊,那麼就多次執行該語句(不同的參數哦)
3. 使用系統預存程序sp_trace_setstatus讓指定Trace開始運行
exec @rc = sp_trace_setstatus @TraceIdOut, @status = 1
4.開始執行一些SQL語句。
5.執行差不多了,再次使用系統預存程序sp_trace_setstatus來停止Trace,並且關閉和刪除這個Trace。
exec sp_trace_setstatus 1,0 --停止Trace
exec sp_trace_setstatus 1,2 --關閉和刪除Trace
(
SELECT * FROM sys.traces
id |
int |
追蹤識別碼。 |
status |
int |
追蹤狀態: 0 = 已停止 1 = 執行中 |
使用 sp_trace_setstatus 預存程式來停止某個追蹤,語法如下:
sp_trace_setstatus <欲停止追蹤的追蹤識別碼>, 0
EG:
--print @TraceIdOut
--SELECT * FROM sys.traces
--exec sp_trace_setstatus 2,0 --停止Trace
--exec sp_trace_setstatus 2,2 --關閉和刪除Trace
之後則可以刪除產生的追蹤檔案
)
6.發現C盤下多了第一步建立的檔案,用SQL Profilter開啟看看吧。。。
注意:
1.如果不執行第5步,那麼第一步建立的檔案是打不開的。
2.SQL好像不能自行刪除檔案,也就是說如果檔案存在,需要手工先行刪除。
3.第一步列印Trace ID的目的是為了最後一步用,因為不在一起執行。。。
4.可以建立兩個任務,第一個是一早執行,開始一個Trace;第二個是晚上執行,關閉Trace。那麼客戶一天的SQL語句執行情況都知道了。。