Sql server 在SQL Server 2005中插入之前检查重复记录
在SQLServer2005中,我有这样一个表 empno name project -------- -------- ----------- 1 ram pro-1 2 sheik pro-2 empno名称项目 -------- -------- ----------- 1 ram pro-1 2谢赫职业2Sql server 在SQL Server 2005中插入之前检查重复记录,sql-server,sql-server-2005,Sql Server,Sql Server 2005,在SQLServer2005中,我有这样一个表 empno name project -------- -------- ----------- 1 ram pro-1 2 sheik pro-2 empno名称项目 -------- -------- ----------- 1 ram pro-1 2谢
现在,当我尝试插入表中已存在empno和项目值的记录时,我想引发错误。如果您想引发错误,可以在
(empno,project)
上放置or,当您尝试插入与索引/约束冲突的值时,将引发异常
或者,如果记录不存在,则可以插入;如果记录已在表中,则可以更新name
:
IF NOT EXISTS (SELECT 1
FROM yourTable AS t
WHERE t.empNo = @yourEmpNo
AND t.project = @yourProject)
BEGIN
INSERT INTO yourTable (empno, name, project)
SELECT @empno, @name, @project
END
ELSE
BEGIN
UPDATE t
SET t.Name = @name
FROM yourTable AS t
WHERE t.empno = @empno
AND t.project = @project
END
如果要引发错误,可以在尝试插入与索引/约束冲突的值时,在(empno,project)
上放置一个or
或者,如果记录不存在,则可以插入;如果记录已在表中,则可以更新name
:
IF NOT EXISTS (SELECT 1
FROM yourTable AS t
WHERE t.empNo = @yourEmpNo
AND t.project = @yourProject)
BEGIN
INSERT INTO yourTable (empno, name, project)
SELECT @empno, @name, @project
END
ELSE
BEGIN
UPDATE t
SET t.Name = @name
FROM yourTable AS t
WHERE t.empno = @empno
AND t.project = @project
END
如果存在,则RAISERROR
,除非相应插入,否则代码块如下所示:
IF EXISTS (SELECT 1 FROM targetTable AS t
WHERE t.empNo = @yourEmpNo
AND t.project = @yourProject)
BEGIN
RAISERROR('Raising errors',18,1)
END
ELSE
BEGIN
INSERT INTO yourTable (empno, name, project)
SELECT @empno, @name, @project
END
如果存在,则RAISERROR
,除非相应插入,否则代码块如下所示:
IF EXISTS (SELECT 1 FROM targetTable AS t
WHERE t.empNo = @yourEmpNo
AND t.project = @yourProject)
BEGIN
RAISERROR('Raising errors',18,1)
END
ELSE
BEGIN
INSERT INTO yourTable (empno, name, project)
SELECT @empno, @name, @project
END
亚当,你的替代方案不正确。您无法确保并行线程不会在代码[如果不存在]之后和[插入]之前插入同一行。要使其正常工作,必须打开事务,锁定整个表,检查记录,然后才进行插入。另一种方法是编写智能触发器,在插入/更新时检查重复项。Adam,您的替代解决方案不正确。您无法确保并行线程不会在代码[如果不存在]之后和[插入]之前插入同一行。要使其正常工作,必须打开事务,锁定整个表,检查记录,然后才进行插入。另一种选择是编写智能触发器,在插入/更新时检查重复项。这也是错误的解决方案,请参阅我对Adam解决方案的评论。这也是错误的解决方案,请参阅我对Adam解决方案的评论