我正在运行Server 2017,希望使用合并语句调查一个错误,如下所示
MERGE INTO table
USING
(SELECT ? AS Search_Col) AS SRC
ON table.blobTask_id = SRC.Search_Col
WHEN MATCHED THEN
UPDATE SET
x= ?,
y= ?,
z= ?
WHEN NOT MATCHED THEN
INSERT (blobTask_id ,x, y, z, )
VALUES (SRC.Search_Col, ?, ?, ?)错误是
违反唯一密钥约束‘IX_U_CCC_GDV_CONTENTCCC__blobTask任务_id’。无法在对象“表”中插入重复键。声明已被终止。
我知道合并语句附带了serveral 格查斯。然而,我可以超越典型的问题(没有触发器,在表上的数据修改上没有并发性)。
奇怪的是,这个错误只是偶尔出现一次,并且再次执行该语句是没有错误的。
我为问题语句的query_hash设置了扩展事件会话筛选。耶利米·佩施卡( Jeremiah )有一个很棒的博客帖子,我就是这样做的。
目前,我的XEvent会话如下所示:
CREATE EVENT SESSION [query hash] ON SERVER
ADD EVENT sqlserver.prepare_sql(
ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name)
WHERE ([sqlserver].[query_hash]=(6577967268103212561.))),
ADD EVENT sqlserver.sp_statement_completed(SET collect_statement=(1)
ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.sql_text)
WHERE ([sqlserver].[query_hash]=(6577967268103212561.))),
ADD EVENT sqlserver.sql_statement_completed(
ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name)
WHERE ([sqlserver].[query_hash]=(6577967268103212561.)))
ADD TARGET package0.event_file(SET filename=N'X:\DB_Data\query_hash.xel',max_file_size=(5),max_rollover_files=(5),metadatafile=N'X:\DB_Data\query_hash.xem')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO问题是,在这个会话中,我只获得如下所示的录音:

不知何故,只有sp_statement_completed事件出现。为了调试这个问题,获取SQL的参数是至关重要的。
我本来希望从prepare_sql事件中得到这些信息,但是由于我的过滤器,它没有出现在session....perhaps中?
。
我们非常感谢你的帮助。
提前谢谢你
马丁
发布于 2019-12-13 12:23:51
谢谢你丹·古兹曼。rpc_completed对我来说是个失踪事件。不幸的是,没有简单的筛选可能是查询哈希,因为没有一个与sp_executesql过程调用相关联的。因此,我选择了对sqltext本身进行筛选(可能是一个代价高昂的操作,但它可以工作)。
这是我最后一次XEvent会话,以防有人利用它:
DROP EVENT SESSION [query hash] ON SERVER;
GO
CREATE EVENT SESSION [query hash] ON SERVER
ADD EVENT sqlserver.sp_statement_completed(SET collect_statement=(1)
ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.sql_text,sqlserver.session_id)
WHERE ([sqlserver].[query_hash]=(6577967268103212561.))),
ADD EVENT sqlserver.rpc_completed(
ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name, sqlserver.query_hash)
--WHERE ([sqlserver].[query_hash]=(6577967268103212561.))
WHERE sqlserver.sql_text LIKE '%ERGE INTO table%'
),
ADD EVENT sqlserver.error_reported(
ACTION(package0.collect_system_time,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_name,sqlserver.sql_text,sqlserver.session_id)
WHERE (([error_number]=2627))
)
ADD TARGET package0.ring_buffer(SET max_events_limit=(100000),max_memory=(512000))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO现在,我等待下一个错误发生,并将张贴的结果和解决方案后,我有一个。
https://dba.stackexchange.com/questions/255563
复制相似问题