2017-07-29 7 views
0

内部結合を使用して、別のデータベースの別のテーブルのデータでテーブル内のデータを更新しようとしています。データ量はかなり大きく、この結果、実行時間が10時間を超える結果、クエリに間違っていると思われます。異なるデータベースの内部結合を使用したSQL更新

UPDATE [Database1]..[Table1] 
SET [Database1]..[Table1].Table1BitValue = 
     CASE 
      WHEN ([Database2]..[Table2].Table2BitValue IS NULL 
        OR [Database2]..[Table2].Table2BitValue = 0) 
       THEN 0 
       ELSE 1 
     END 
FROM [Database1]..[Table1] 
INNER JOIN [Database2]..[Table2] ON [Database2]..[Table2].[Table2Id] = [Database1]..[Table1] .[Table1Id] 
+0

上で実行する前に確認してくださいはい、 –

+0

それを投稿、私はそれがまだ – xDevil

+0

ポストにテーブル –

答えて

1

あなたはチャンクでテーブルを更新してみてください。 アイデアは、これはチャンクだけの考えであるため、行

DECLARE @maxID INT, 
     @startRange INT, 
     @endRange INT, 
     @batchSize INT; -- keep below 5000 to be safe 

SET @batchSize = 2000; 
SET @startRange = 0; 
SET @endRange = @batchSize; 

SET @maxID = 1; 
SELECT @maxID = max([Table1Id]) FROM [Database1]..[Table1]  

BEGIN TRY  
    WHILE (@startRange < @maxID) 
    BEGIN 

    UPDATE [Database1]..[Table1] 
    SET [Database1]..[Table1].Table1BitValue = 
     CASE 
      WHEN ([Database2]..[Table2].Table2BitValue IS NULL 
        OR [Database2]..[Table2].Table2BitValue = 0) 
       THEN 0 
       ELSE 1 
     END 
    FROM [Database1]..[Table1] 
    INNER JOIN [Database2]..[Table2] ON [Database2]..[Table2].[Table2Id] = [Database1]..[Table1].[Table1Id] 
    WHERE [Database1]..[Table1].[Table1Id] BETWEEN @startRange AND @endRange; 

    SET @startRange = @endRange + 1; 
    SET @endRange = @endRange + @batchSize; 
    END; 
END TRY 

BEGIN CATCH 
-- Add your code for: RAISERROR(); 
    RETURN; 
END CATCH; 

の数が多いために、テーブル全体をロックしないようにすることです、あなたはあなたのニーズに応じて変更することができます。 が確認されていませんが、スクリプト

+0

私はtommorowを試します。どのように私は今それを作った24時間以上が終わっていないと私はそれがばかげているので、それをキャンセルしなければならなかった。 – xDevil

+0

ほとんど変更を加えずに作業しましたが、クエリは約2時間30分で終了しました。 – xDevil

関連する問題