2

私は2つの簡単なテーブルを持っています

+------|---------|----------+
+  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両方のテーブルのfromが主キーです。

ストアドプロシージャでは、次のような一時テーブルを作成します。

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+
+------|---------+

ここに簡単な例を示しました。私のデータベースには、10万を超える行と多くの列があります。

ありがとう

4

2 に答える 2

3

エラーを発生させてステートメント全体を失敗させるのではなく、重複キーを挿入しようとする試みを (警告付きで) 無視するには、IGNORE_DUP_KEYオプションを使用できます。

CREATE TABLE #tempTable
  (
     ID    INT NOT NULL PRIMARY KEY NONCLUSTERED WITH (IGNORE_DUP_KEY = ON),
     FIELD VARCHAR(255)
  ) 
于 2012-10-16T14:02:01.200 に答える
0

2つのテーブルの間の@myCustomSQLにUNIONを入れて、重複を除外することはできませんか?

そうでない場合は、GOTOが最適です。

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

私は通常、それほど厄介なものはお勧めしませんが、あなたは明らかにすでにダーティなデータを持っているので、これがそれを修復するための一度限りのものであることを願っています。

于 2012-10-16T13:45:52.963 に答える