2014-05-14 4 views
15

Ich habe SQL Server erweitert Ereignisse einrichten die letzten 1000 fehlgeschlagen Abfragen in einer bestimmten Datenbank in einen Ringpuffer zu fangen:Capture übergebene Parameterwerte in erweiterten SQL Server-Sitzungen?

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 

:

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 

ich jetzt diese Fehler wie so abfragen so weit, so gut:

screenshot

Diese bereits eine große Hilfe detaillierter in dem Aufspüren auf Fehler gewesen tha t auf die Anwendungsebene geworfen werden.

Was würde es noch nützlicher machen, wenn wir sehen könnten, wie die Parameterwerte an diese Abfragen übergeben werden, so wie Sie es in SQL Profiler können. Also, wenn wir einen Fehler wie diese sehen ...

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

für diese SQL ...

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

... wäre es aufschlussreich sein zu wissen, was die Werte der @NewValue und @KeyValue Parameter waren .

Irgendwelche Ideen, wo ich diese Informationen finden könnte?

+0

dies kann/kann nicht helfen: http://www.brentozar.com/archive/2013/08/what-queries-are-failing-in-my-sql-server/ – Tanner

+1

@Tanner - nein, nichts in Dort über Parameter. –

+0

Ich würde vorschlagen, nur den [SQL Server Profiler] (http://msdn.microsoft.com/en-us/library/ms181091.aspx) zu verwenden. – Brian

Antwort

2

Ich denke nur sqlserver.rpc_completed Ereignis wird Ihnen komplette SQL-Befehl einschließlich Parameterwerte geben.

+0

Können Sie klären, wie das für dieses Szenario funktionieren würde? Gibt es zum Beispiel eine Möglichkeit, rpc_completed nur zu erfassen, wenn die Abfrage fehlschlägt? –

+0

Sie können das Ereignis rpc_completed für das Feld "result" filtern, das das Ergebnis eines RPC-Aufrufs ist. Es kann OK, Error, Abort und Übersprungen sein. – Endrju

+0

Ich bin neu bei erweiterten Veranstaltungen. Kann jemand bitte sql Skript posten, um Speicherprozedur mit Parametern zu erfassen? – Mahesh