別のテーブルのデータでテーブルを上書きする-SQL


9

ユーザーは本番環境からQAデータベースを更新したいが、2つのテーブル(T1とT2と呼ぶ)が元のQAデータを保持することを望んでいます。そのため、2つのテーブルをQA(DB1)から一時QAデータベース(DB2)にコピーしました。次に、DB1を本番環境から更新しました。更新後、T1およびT2データをDB2からDB1に上書きして、更新前のQA値を含めることができるようにします。

私は次のことを行いました:

  1. 使用する

    select * 
    INTO D1.dbo.T1
    FROM D2.dbo.T1
    
  2. 次に、製品からD1を更新しました

  3. 次に、次の手順でT1を切り捨てます。

    SELECT COUNT(*) AS BeforeTruncateCount
    FROM T1;
    GO
    TRUNCATE TABLE T1;
    GO
    SELECT COUNT(*) AS AfterTruncateCount
    FROM T1;
    GO
    
  4. D2.T1からD1.T1にデータをコピーするために戻ると、データベースにT1という名前のオブジェクトが既に存在するというエラーが表示されます。

テーブルをドロップしてコピーする必要がありますか?

または、手順全体に適した方法はありますか?

回答:


6

@Kinと@DavidSpillettからの回答を組み合わせる。

最初の仮定。DB1とDB2は同じインスタンス上にあります。それは確かに彼らのように聞こえますが、明白なことを述べることは決して害にはなりません(特に、私が以前に明白だったと私が思っていたことが間違っていたためです)。

そのため、データが大きい場合、たとえば数百万行とすると、SSISパッケージを使用します。これには、使用する特定の機能が1つあります。バッチサイズを指定できます。これにより、トランザクションのサイズが小さくなります。SSISパッケージの欠点は、プロセスがある程度複雑になることです。大きなテーブルではありませんが、小さなテーブルで作業している場合は必要ありません。

それは私たちを他の選択肢に導きます。ただし、データが数十万以下の範囲にある場合は、次のようなコードを使用します。

USE D1;
GO
TRUNCATE TABLE dbo.T1;
GO
INSERT INTO D1.dbo.T1
SELECT * 
FROM D2.dbo.T1;
GO

そして最後に、それが境界線のどこかにある場合は、両方を試してみて、あなたにとって最も効果的なものを見てみます。

注:でを使用しないことを検討SELECT *INSERT INTO、代わりにフィールドリストを指定することもできます。

その構造は次のようになります

INSERT INTO D1.dbo.T1 (Field1, Field2)
SELECT Field1, Field2
FROM D2.dbo.T1;

情報をありがとう。はい、テーブルには7800行しかないため、かなり小さく、同じインスタンス上にあります。私は(選択なしで)INSERT INTOを使用してみましたが、完全に機能しました。これを共有していただきありがとうございます。また、SSMSを使用したデータのインポートでテストしました。それもうまくいきました。
リズワン2013

1
*テーブルにインデントフィールドがある場合は、フィールドリストを指定する必要があります(を使用しないでください)。これらの値を単に「コピー」することはできません。
コンラッド

6

SELECT <stuff> INTO <target> FROM ...構文がSQL ServerのIIRC では、宛先テーブルを最初から作成することを常に想定しています。テーブルがすでに存在する場合は、INSERT <target> SELECT <stuff> FROM ...代わりに試してください。


5
さらに、D1にデータを戻す場合、Davidの回答もDROPおよびSELECT INTOよりも適切なルートです。D1テーブルを削除すると、子オブジェクト(外部キー、主キー、トリガーなど)が失われるためです。 )
Delux 2013

2
@Deluxに同意します。失うもう1つの重要なことは、明示的なアクセス許可です。ユーザーが(と言うのではなくdb_datareader)そのテーブルに固有の権限を持っている場合、テーブルを削除すると、それらの権限が失われます。
ケネスフィッシャー

それは素晴らしいヒントです。私は今までDROPの影響を理解していませんでした。ありがとうございました!
リズワン2013

6

これを行うには、SSIS(データのインポート/エクスポート)を使用するのが最適です。選択したテーブルをソースから宛先に転送するだけの機能があります。必要に応じて、パッケージを保存して、今後の転送や繰り返し転送で再利用できるようにすることもできます。

編集:わかりやすくするためにスクリーンショットを追加しています。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください


すごい..素晴らしいスクリーンショットをありがとう..彼らは素晴らしい助けです
リズワン2013

素晴らしいソリューション、素晴らしいスクリーンショットが機能します!
Mayer Spitzer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.