在SQL Server 2005中遇到异常时继续在临时表中插入数据(也适用于2008年)

在SQL Server 2005中遇到异常时继续在临时表中插入数据(也适用于2008年),sql,sql-server-2008,sql-server-2005,Sql,Sql Server 2008,Sql Server 2005,我有两张简单的桌子 +------|---------|----------+ + ID | Value | Test + +------|---------|----------+ + 3 | Test | 12345 + + 4 | MyVal | 56789 + + 5 | Another| 101010 + +------|---------|----------+ +------|---------|---------

我有两张简单的桌子

+------|---------|----------+
+  ID  |  Value  |   Test   +
+------|---------|----------+
+  3   |   Test  |   12345  +
+  4   |  MyVal  |   56789  +
+  5   |  Another|   101010 +
+------|---------|----------+



+------|---------|----------+
+  ID  |  Value  |   Test   +
+------|---------|----------+
+  3   |   Test  |   12345  +
+  7   |  MyVal12|   56789  +
+  5   |  Another|   101010 +
+------|---------|----------+
两个表中的
ID
都是主键

在存储过程中,我创建了一个临时表,如下所示:

CREATE TABLE #tempTable(
        ID int NOT NULL PRIMARY KEY NONCLUSTERED,
        FIELD VARCHAR(255))
以及存储在
try catch
块中的过程部分:

BEGIN TRY
INSERT INTO #tempTable(ID, FIELD)
EXEC sp_executesql @myCustomSql, @paramList, @param1, @param2 ...
END TRY

BEGIN CATCH
      // what to put here ?
END CATCH
我想将行添加到我的临时表中(您将看到ID=3和5的重复项),然后我想继续添加。最后,我想为表提供以下内容:

+------|---------+
+  ID  |  FIELD  +
+------|---------+
+  3   |   Test  +
+  4   |  MyVal  +
+  5   |  Another+ 
+  7   |  MyVal12+
+------|---------+
我在这里给出了一个简化的示例,在我的数据库中,我有超过十万行和许多列


谢谢

您能不能在两个表之间的@myCustomSQL中加入一个联合以过滤掉重复项

如果不是这样的话,也许去一趟对你来说是最好的

DECLARE @minID int;
SET @minID = 0;

-- Ensure your myCustomerSql only gets records with ID greater than @minID

:CarryOn

BEGIN TRY
INSERT INTO #tempTable(ID, FIELD)
EXEC sp_executesql @myCustomSql, @paramList, @param1, @param2 ...
END TRY

BEGIN CATCH
    IF ERROR_NUMBER() = 2627 -- Error code for duplicate key
    THEN
        SET @min_ID = SELECT MAX(ID) + 1 FROM #TempTable;
        GOTO CarryOn
    ELSE
        --Handle other errors somehow
END CATCH
我通常不会推荐像这样混乱的东西,但显然您已经有了脏数据,所以我希望这是一次性修复。要忽略(带有警告)插入重复键的尝试,而不是引发错误并使整个语句失败,您可以使用该选项


是否创建表#可诱惑(ID int NOT NULL主键非聚集(IGNORE_DUP_KEY=ON),字段VARCHAR(255))
执行您需要的操作?是的,很好的解决方案。你可以移动此评论并作出答复,我将接受。
CREATE TABLE #tempTable
  (
     ID    INT NOT NULL PRIMARY KEY NONCLUSTERED WITH (IGNORE_DUP_KEY = ON),
     FIELD VARCHAR(255)
  )