CREATE OR ALTER VIEW dbo.view_exceptions AS WITH ring_buffer AS ( SELECT data = CAST(st.target_data AS XML) FROM sys.dm_xe_database_session_targets AS st JOIN sys.dm_xe_database_sessions AS s ON s.address = st.event_session_address WHERE s.name = N'Exceptions' AND st.target_name = N'ring_buffer' ), events AS ( SELECT D.d.query('.') AS xml, D.d.value('@timestamp', 'datetime2(3)') as timestamp_utc FROM ring_buffer CROSS APPLY data.nodes('/RingBufferTarget/event') AS D(d) ), events2 AS ( SELECT xml, row_number() OVER(ORDER BY timestamp_utc) AS eventno, dateadd(HOUR, datediff(HOUR, getutcdate(), getdate()), timestamp_utc) AS when_ FROM events ), extracted AS ( SELECT e2.when_, e2.eventno, D.d.value('@name', 'nvarchar(128)') AS name, D.d.value('(value/text())[1]', 'nvarchar(MAX)') AS value, convert(varbinary(85), F.f.value('@handle', 'varchar(200)'), 1) AS sql_handle, F.f.value('@line', 'int') AS linenum, F.f.value('@offsetStart', 'int') AS stmt_start, F.f.value('@offsetEnd', 'int') AS stmt_end FROM events2 e2 CROSS APPLY e2.xml.nodes('/event/*') AS D(d) OUTER APPLY D.d.nodes('value/frames/frame[@level="1"]') AS F(f) ), pivoted AS ( SELECT eventno, when_, MIN(CASE name WHEN 'client_app_name' THEN value END) AS appname, MIN(CASE name WHEN 'client_hostname' THEN value END) AS hostname, MIN(CASE name WHEN 'session_server_principal_name' THEN value END) AS username, MIN(CASE name WHEN 'error_number' THEN CAST(value AS int) END) AS errno, MIN(CASE name WHEN 'message' THEN value END) AS errmsg, MIN(CASE name WHEN 'database_name' THEN value END) AS DB, MIN(CASE name WHEN 'sql_text' THEN value END) AS batch_text, MIN(CASE name WHEN 'tsql_stack' THEN sql_handle END) AS sql_handle, MIN(CASE name WHEN 'tsql_stack' THEN linenum END) AS linenum, MIN(CASE name WHEN 'tsql_stack' THEN stmt_start / 2 END) AS stmt_start, MIN(CASE name WHEN 'tsql_stack' THEN IIF(stmt_end = -1, 1000000000, (stmt_end - stmt_start) / 2 + 1) END) AS stmt_len FROM extracted GROUP BY eventno, when_ ) SELECT p.when_, p.username, p.hostname, p.appname, p.errno, p.errmsg, p.DB, CASE WHEN est.dbid = 32767 THEN object_name(est.objectid) ELSE object_schema_name(est.objectid) + '.' + object_name(est.objectid) END AS SPname, p.linenum, p.batch_text, substring(est.text, stmt_start + 1, stmt_len) AS statement FROM pivoted p OUTER APPLY sys.dm_exec_sql_text(p.sql_handle) est