2014-05-14 25 views
15

我已經設置了SQL Server擴展事件趕過去1000次失敗的特定數據庫查詢到一個環形緩衝區:在SQL Server擴展會話中捕獲傳遞的參數值?

Create Event Session [Errors] on Server 
Add Event sqlserver.error_reported (
    Action(
     sqlos.task_time, 
     sqlserver.sql_text 
    ) 
    Where sqlserver.database_name=N'MyDatabase' 
    And error_number<>5701 -- Ignore changed db context messages 
) 
Add target package0.ring_buffer(Set max_memory=102400) 
With (
    MAX_MEMORY=4096 KB, 
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS, 
    MAX_DISPATCH_LATENCY=30 SECONDS, 
    MAX_EVENT_SIZE=0 KB, 
    MEMORY_PARTITION_MODE=NONE, 
    TRACK_CAUSALITY=OFF, 
    STARTUP_STATE=ON 
) 
Go 

我現在可以查詢這些錯誤,像這樣:

Select 
    xmldata = Cast(xet.target_data as xml) 
Into #rbd 
From sys.dm_xe_session_targets xet 
Join sys.dm_xe_sessions xe ON (xe.address = xet.event_session_address) 
Where xe.name='errors' and target_name='ring_buffer' 

; With Errors as (
    Select 
     e.query('.').value('(/event/@timestamp)[1]', 'datetime') as "TimeStamp", 
     e.query('.').value('(/event/data[@name="message"]/value)[1]', 'nvarchar(max)') as "Message", 
     e.query('.').value('(/event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') as "SqlText", 
     e.query('.').value('(/event/action[@name="task_time"]/value)[1]', 'bigint')/@@TIMETICKS as "Duration" 
    From #rbd 
    Cross Apply XMLData.nodes('/RingBufferTarget/event') as Event(e) 
) 
Select * from Errors 
Where SqlText is not null 

Drop Table #rbd 

到目前爲止,一切都很好:

screenshot

這已經在錯誤的塔追查詳細一個很大的幫助不會被拋到應用程序級別。

將使其更加有用什麼,不過,是如果我們能看到被傳遞到這些查詢的參數值,在SQL事件探查器的方式就可以了。所以當我們看到這樣的錯誤...

Conversion failed when converting date and/or time from character string. 

這個SQL ...

(@NewValue nvarchar(10),@KeyValue int) 
Update SomeTable 
Set [email protected] Where [email protected] 

...這將是信息知道什麼是@NewValue@KeyValue參數的值分別爲。

在那裏可以找到這些信息的任何想法?

+0

這可能/可能無法幫助:http://www.brentozar.com/archive/2013/08/what-queries-are-failing-in-my-sql-server/ – Tanner

+1

@Tanner - 不,沒什麼有關於參數。 –

+0

我會建議使用[SQL Server Profiler](http://msdn.microsoft.com/zh-cn/library/ms181091.aspx)。 – Brian

回答

2

我想只有sqlserver.rpc_completed事件會給你包括參數值完整的SQL命令。

+0

你能澄清一下如何在這種情況下工作嗎?例如,是否有一種方法只能在查詢失敗時捕獲rpc_completed? –

+0

您可以過濾在「結果」字段中rpc_completed事件是RPC調用的結果,就可以OK,錯誤,中止和跳過。 – Endrju

+0

我是新來的擴展事件。任何人都可以請張貼SQL腳本捕獲存儲過程的參數? – Mahesh