Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/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 Server 2005中插入之前检查重复记录_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 在SQL Server 2005中插入之前检查重复记录

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

在SQLServer2005中,我有这样一个表

empno name project -------- -------- ----------- 1 ram pro-1 2 sheik pro-2 empno名称项目 -------- -------- ----------- 1 ram pro-1 2谢赫职业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解决方案的评论