Sql server 无法执行存储过程,但存储过程中的update语句有效

Sql server 无法执行存储过程,但存储过程中的update语句有效,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有一个数据库,目前已复制到三个不同的位置。它被用于一个应用程序,所有的表、存储过程和项目也被选中进行复制 尝试通过存储过程更新ContactCSR时,出现以下错误: Msg 2627,第14级,状态1,程序UpdateContactCSRs,第14行 违反主键约束“PK_ContactCSRs”。无法插入 对象“dbo.ContactCSRs”中存在重复密钥。重复的键值为 (3443001,dand)。该声明已被终止 存储过程的内容如下所示: SET ANSI_NULLS ON GO SE

我有一个数据库,目前已复制到三个不同的位置。它被用于一个应用程序,所有的表、存储过程和项目也被选中进行复制

尝试通过存储过程更新ContactCSR时,出现以下错误:

Msg 2627,第14级,状态1,程序UpdateContactCSRs,第14行 违反主键约束“PK_ContactCSRs”。无法插入 对象“dbo.ContactCSRs”中存在重复密钥。重复的键值为 (3443001,dand)。该声明已被终止

存储过程的内容如下所示:

  SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[UpdateContactCSRs] @Contact int,
    @CSR varchar(50),
    @Memo varchar(max),
    @Notify bit,
    @OldCSR varchar(50)
AS
BEGIN
    UPDATE ContactCSRs SET CSR = @CSR,Memo = @Memo, Notify = @Notify WHERE Contact = @Contact  AND CSR = @OldCSR;
END
但是,当我在过程中运行update命令时,它会工作

不完全确定为什么会发生这种情况,因为即使update语句工作,存储过程也不工作

下面是我正在运行的存储过程命令:

exec UpdateContactCSRs 3443001, 'dand','Relationship Manager',1,'AndyK'
UPDATE ContactCSRs SET CSR = 'dand',Memo = 'Relationship Manager', Notify = 1 WHERE Contact = 3443001 AND CSR = 'AndyK'
下面是我正在运行的更新语句:

exec UpdateContactCSRs 3443001, 'dand','Relationship Manager',1,'AndyK'
UPDATE ContactCSRs SET CSR = 'dand',Memo = 'Relationship Manager', Notify = 1 WHERE Contact = 3443001 AND CSR = 'AndyK'

如果在存储过程调用中指定参数名称,是否仍会出现错误

exec UpdateContactCSRs @Contact = 3443001, @CSR = 'dand', @Memo = 'Relationship Manager', @Notify = 1, @OldCSR = 'AndyK'

是否使用与存储过程完全相同的参数运行update命令?是否确实将相同的参数传递给存储过程和update语句?基本上,当您通过应用程序传递语句时,它可能与手动运行update语句时不同。主键错误意味着您在这些字段中的任何一个字段上进行的更新都有一个要求其唯一的约束,您正在将其设置为数据库中已经存在的内容。这两种情况都不是。如果是这种情况,那么Update语句也不应该工作,对吗?我已经尝试通过MSSQL运行存储过程,这就是我遇到的错误。这仍然不起作用。我收到了相同的错误消息。约束或表的索引有什么问题吗?我不认为约束或索引有什么问题,我认为在存储过程的背后发生了一些你看不到的事情。执行存储过程并在运行时捕获跟踪(在SSMS的“SQL Server Profiler中的跟踪查询”中的“查询”菜单下)。谢谢。它现在似乎正在工作。我做了一个更改…但似乎它没有被复制,所以当我在订阅服务器上执行命令时它失败了。它现在可以工作了。但是,我现在在应用程序中遇到了并发冲突,即使update命令可以工作。有没有关于为什么会发生这种情况的想法。