(使用SS2008)在sql server数据库中,我想复制一个客户端的所有数据以用于新客户端。换句话说,生成与客户端#1相关的所有记录的精确副本,现在新记录的客户端ID字段引用客户端#2。这都在同一个数据库中。
通常我会在选择客户端#1记录的相关表上使用一系列INSERT命令来执行此操作。但是,某些表具有自动编号ID列,并且这些ID在子表中作为外键引用。因此,在生成子表记录时,我需要知道并引用新创建的自动编号ID。
最简洁的方法是什么?可以使用SQL Server复制吗?我对SQL Server的了解相当温和。
答案 0 :(得分: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