Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 出现重复的主键,同时选择“进入”。SQL代理作业_Sql Server_Tsql_Primary Key - Fatal编程技术网

Sql server 出现重复的主键,同时选择“进入”。SQL代理作业

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&

通常运行非常可靠的代理作业刚刚失败,出现了一个相当意外的错误。它在抱怨,因为它发现了一个重复的主键,据我所知,不可能存在重复的主键。 FWIW数据库是复制订阅服务器

模糊细节: 这是代理通知

-----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