Sql server 出现重复的主键,同时选择“进入”。SQL代理作业
通常运行非常可靠的代理作业刚刚失败,出现了一个相当意外的错误。它在抱怨,因为它发现了一个重复的主键,据我所知,不可能存在重复的主键。 FWIW数据库是复制订阅服务器 模糊细节: 这是代理通知Sql server 出现重复的主键,同时选择“进入”。SQL代理作业,sql-server,tsql,primary-key,Sql Server,Tsql,Primary Key,通常运行非常可靠的代理作业刚刚失败,出现了一个相当意外的错误。它在抱怨,因为它发现了一个重复的主键,据我所知,不可能存在重复的主键。 FWIW数据库是复制订阅服务器 模糊细节: 这是代理通知 -----Original Message----- From: SQL Notification Service Sent: Tuesday, 12 February 2019 12:30 PM To: My SQL Notification Service <blah@blahblah.org&
-----Original Message-----
From: SQL Notification Service
Sent: Tuesday, 12 February 2019 12:30 PM
To: My SQL Notification Service <blah@blahblah.org>
Subject: [The job failed.] SQL Server Job System: 'Blah Populate Blah Table' completed on \\BLAH.
JOB RUN: 'Blah Populate Blah Table' was run on 12/02/2019 at 12:30:00 PM
DURATION: 0 hours, 0 minutes, 1 seconds
STATUS: Failed
MESSAGES: The job failed. The Job was invoked by Schedule 1029 (Occurs every day every 15 minute(s)). The last step to run was step 1 (Run UspGetBlah).
下面是生成错误的存储过程中的代码。请注意,dbo.blah
上有一个主键约束(blah_id
):
declare @now as datetime = getdate()
;
if object_id('tempdb..#blah') is not null
drop table #blah;
select blah.blah_id --This is the PK
,blah.person_id
,blah.start_dttm
,case when blah.end_flag = 'n'
then blah.end_dttm
end as end_dttm
,case when blah.end_flag = 'n'
and blah.end_dttm is not null
then blah.location_id
end as location_id
into #blah
from dbo.blah blah
where blah.warning_flag = 'n'
and blah.start_flag = 'n'
and (blah.end_dttm is null
or blah.end_dttm > @now - 20
or blah.end_flag = 'y'
)
and blah.site_id in('221','331')
;
create unique clustered index ix_0x01ef45 on #blah (blah_id)
;
关于如何做到这一点,有什么建议吗?哦,我不能复制它
按以下要求编辑源表的DDL(出于IP原因,我重命名了字段,并删除了所有不相关的字段):
根据你的解释,我不知道这怎么可能。所以肯定还有更多的东西。。。是否还有其他过程也在添加数据?更复杂的select语句?不是您期望的表(该表后缀是否存在某种动态命名?)您真的要插入到临时表中吗?因为如果它确实是一个临时表,那么它只能在创建它的会话中访问,因此我们可以排除来自两个不同会话的同时插入尝试-如果它不是临时表,这很可能是对这个select into的解释——因为这个select语句本身不能生成主键的重复值(或
dbo.blah
中的任何其他唯一列。zohar-peled这是一个与描述完全相同的本地临时表。nick McDermad除了您看到的内容之外,该语句没有其他内容。我确实想知道这是否与复制活动有关。该作业针对订阅服务器运行。应用程序记录活动并记录它。)行似乎是在作业尝试运行的同时更新的。我在上述消息中唯一更改的是对象的名称(例如更改为blah)。我知道这很奇怪,这就是我发布这个问题的原因。你能提供一个表和主键的DDL吗?这种情况是可能的,或者是因为你有复合主键,或者你陷入了数据引擎的一些错误,这是不太可能的。。另一个问题,是使用了READ UNCOMMITTED隔离级别吗?根据你的解释,不知道它是怎么回事是可能的。所以肯定还有更多的内容…其他一些过程也在添加数据?一个更复杂的select语句?不是您期望的表(该表后缀是否有某种动态命名?)您真的要插入到临时表中吗?因为如果它真的是临时表,则只能在创建它的会话中访问它,因此我们可以排除两个不同会话中同时插入的尝试-如果它不是临时表,这很可能就是此select into的解释-如此select语句所示它本身不能产生主键的重复值(或dbo.blah
中的任何其他唯一列。zohar-peled这是一个与描述完全相同的本地临时表。nick McDermad除了您看到的内容之外,该语句没有其他内容。我确实想知道这是否与复制活动有关。该作业针对订阅服务器运行。应用程序记录活动并记录它。)行似乎是在作业尝试运行的同时更新的。我在上述消息中唯一更改的是对象的名称(例如更改为blah)。我知道这很奇怪,这就是我发布这个问题的原因。你能提供表和主键的DDL吗?这种情况可能发生,或者是因为你有复合主键,或者你陷入了数据引擎的一些错误,这是不太可能的。另一个问题,是否使用了读取未提交隔离级别?
declare @now as datetime = getdate()
;
if object_id('tempdb..#blah') is not null
drop table #blah;
select blah.blah_id --This is the PK
,blah.person_id
,blah.start_dttm
,case when blah.end_flag = 'n'
then blah.end_dttm
end as end_dttm
,case when blah.end_flag = 'n'
and blah.end_dttm is not null
then blah.location_id
end as location_id
into #blah
from dbo.blah blah
where blah.warning_flag = 'n'
and blah.start_flag = 'n'
and (blah.end_dttm is null
or blah.end_dttm > @now - 20
or blah.end_flag = 'y'
)
and blah.site_id in('221','331')
;
create unique clustered index ix_0x01ef45 on #blah (blah_id)
;
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[BLAH](
[BLAH_ID] [numeric](10, 0) IDENTITY(500000,1) NOT FOR REPLICATION NOT NULL,
[PERSON_ID] [numeric](10, 0) NOT NULL,
[LOCATION_ID] [numeric](10, 0) NOT NULL,
[SITE_ID] [numeric](10, 0) NOT NULL,
start_dttm [datetime] NOT NULL,
end_dttm [datetime] NULL,
start_flag char(1) NOT NULL,
end_flag char(1) NOT NULL,
warning_flag char(1) NOT NULL,
CONSTRAINT [CPK_BLAH] PRIMARY KEY NONCLUSTERED
(
[BLAH_ID] ASC
)WITH (PAD_INDEX = ON
, STATISTICS_NORECOMPUTE = OFF
, IGNORE_DUP_KEY = OFF
, ALLOW_ROW_LOCKS = ON
, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [INDEX]
GO