2009-09-07 119 views
3

我有sql服务器程序,请参阅下文。如果记录已经存在,请停止插入表中

ALTER PROCEDURE [dbo].[uspInsertDelegate] 
(
    @CourseID int, 
    @CPUserID int, 
    @StatusID int, 
    @CreateUser varchar(25) 

) 
AS 
    SET NOCOUNT OFF; 
INSERT INTO tblDelegate      
(
    CourseID, 
    CPUserID, 
    StatusID, 
    CreateUser 

) 
VALUES  
(
    @CourseID, 
    @CPUserID, 
    @StatusID, 
    @CreateUser 
) 

RETURN 

现在我不想要插入到表tblDelegate如果插入courseidcpuserid是相同的,在表tblDelegate

+0

你想要插入? http://stackoverflow.com/questions/13540/insert-update-stored-proc-on-sql-server – 2009-09-07 08:44:09

+0

@Sam:它看起来更像是一个插入(如果不存在)问题 – pjp 2009-09-07 09:22:09

回答

2

记录简单的第一次考验。在SQL Server 2005中,您也可以尝试/捕获以忽略重复的错误。

IF NOT EXISTS (SELECT * 
     FROM tblDelegate 
     WHERE CourseID = @CourseID etc) 
    INSERT INTO tblDelegate      
    (
     CourseID, 
     CPUserID, 
     StatusID, 
     CreateUser 

    ) 
    VALUES  
    (
     @CourseID, 
     @CPUserID, 
     @StatusID, 
     @CreateUser 
    ) 

请问:您的意思是“SET NOCOUNT ON”?

+1

这对于并发性并不安全,并发性很强你会得到愚蠢的。 – 2009-09-07 08:43:13

+0

总是值得添加唯一的关键约束,并使用适当的锁定级别。 – pjp 2009-09-07 08:53:59

+0

@Sam:真的,看到它发生了,但在很多情况下都可以。 @pjp:PK通常是唯一的约束 – gbn 2009-09-07 10:13:12

1

您正在使用的是什么版本的SQL Server?如果你在2008年查阅MERGE声明。

然后如第一个答案中指出的那样使用IF NOT Exists Clause。

+0

我正在使用SQL Server 2005. – 2009-09-07 08:43:50

+0

谢谢亲爱的!您的帮助 – 2009-09-07 09:31:39

3

添加一个唯一键约束到courseidcpuuserid列。

如果您尝试插入一个复制,您将会遇到密钥违规。

除了这样做之外,您还可以在使用存储过程插入之前测试其值是否存在。

BEGIN TRAN 

SELECT 1 
FROM tblDelegate WITH (TABLOCK) 
WHERE [email protected] 
     AND [email protected] 
IF @@rowcount = 0 
BEGIN 
--Record doesn't already exist 
--Insert it 
END 

COMMIT 
相关问题