3

(SS2008 を使用) SQL Server データベース内で、1 つのクライアントのすべてのデータを新しいクライアントにコピーしたいと考えています。つまり、新しいレコードのクライアント ID フィールドがクライアント #2 を参照することを除いて、クライアント #1 に関連するすべてのレコードの正確な複製を生成します。これはすべて同じデータベース内にあります。

通常、関連するテーブルで一連の INSERT コマンドを使用してこれを行い、クライアント #1 レコードを選択します。ただし、一部のテーブルには自動付番 ID 列があり、これらの ID は子テーブルの外部キーとして参照されます。したがって、子テーブル レコードを生成するときは、新しく作成された自動付番 ID を知り、参照する必要があります。

これを行う最もクリーンな方法は何ですか? SQL Server レプリケーションで実行できますか? SQL Server に関する私の知識はかなり中程度です。

4

1 に答える 1

5

私はこのようなことをします:

-- Set up a placeholder for the new id
DECLARE @NewID INT;

-- INSERT parent record
INSERT INTO myTable (field1, field2)
SELECT field1, field2 FROM myTable WHERE ID = 1

-- Get the new ID
SET @NewID = (SELECT SCOPE_IDENTITY());

-- Insert child records with new id 
INSERT INTO OtherTable (fkid, field1, field2)
SELECT @NewID, field1, field2 FROM OtherTable WHERE ID = 1

数千のレコードを処理する必要がある場合、これでうまくいく可能性があります。

-- Add a new column in the database to manage where the record came from
ALTER TABLE myTable ADD ParentID int NULL

-- INSERT parent record
INSERT INTO myTable (field1, field2, ParentID)
SELECT 
    field1
    , field2
    , ID 
FROM myTable 
WHERE SomeCondition IS True

-- Insert child records with new id 
INSERT INTO OtherTable (fkid, field1, field2)
SELECT 
    myTable.ID
    , OtherTable.field1
    , OtherTable.field2 
FROM 
    OtherTable 
    INNER JOIN myTable ON OtherTable.FKID = myTable.ParentID

-- Once unneeded, drop the temporary column
-- ALTER TABLE myTable DROP COLUMN ParentID
于 2011-09-16T18:28:41.267 に答える