19

我设置了 SQL Server 扩展事件以将特定数据库中最后 1000 个失败的查询捕获到环形缓冲区中:

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

到现在为止还挺好:

截屏

这对于追踪在应用程序级别引发的错误的更多细节已经有很大帮助。

但是,如果我们可以看到传递给这些查询的参数值,就像在 SQL Profiler 中那样,它会变得更加有用。所以当我们看到这样的错误时......

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

对于这个 SQL...

(@NewValue nvarchar(10),@KeyValue int)
Update SomeTable 
Set SomeField=@NewValue Where SomeTableID=@KeyValue

...了解@NewValue@KeyValue参数的值将是有益的。

我可以在哪里找到这些信息的任何想法?

4

1 回答 1

8

我认为只有 sqlserver.rpc_completed 事件会给你完整的 SQL 命令,包括参数值。

于 2014-05-18T09:56:28.063 回答