使用新ID生成脚本(也用于依赖项)

时间:2015-07-13 11:57:05

标签: sql-server tsql sql-server-2008-r2 ssms

在Microsoft SQL Server 2008 R2中,我将一些数据存储在一个表中,我想要一个脚本,该脚本只使用不同的guids(uniqueidentifier)创建数据的精确副本。挑战在于,其他表中的数据也依赖于主表。还应复制这些数据并将其引用到新条目中。

结构如下:

表格形式:

Guid    Name
335AC2DD-C874-45E4-90AA-194882DB7C12    Testform

表格字段:

Guid    FormGuid    Name
9640CA20-2CE6-4BFB-929C-8A92D313DEB2    335AC2DD-C874-45E4-90AA-194882DB7C12    Testfield

现在我想复制两个表的数据,所有条目都应该获得一个新的主键。表字段中 FormGuid 的值也应该引用新的id。

结果应该是这样的:

表格形式:

Guid    Name
335AC2DD-C874-45E4-90AA-194882DB7C12    Testform
B649C385-278B-4163-882C-E5C3B6A96F2F    Testform

表格字段:

Guid    FormGuid    Name
9640CA20-2CE6-4BFB-929C-8A92D313DEB2    335AC2DD-C874-45E4-90AA-194882DB7C12    Testfield
C7C65EEE-E02B-49F5-99CD-F0042CC15C4F    B649C385-278B-4163-882C-E5C3B6A96F2F    Testfield

有没有办法在SQL Server Management Studio中自动生成这种脚本? 在" Generate Scripts"向导我只能用现有的主键生成脚本。

1 个答案:

答案 0 :(得分:1)

这样的东西?我使用表值变量将列“添加”到原始表单表。

DECLARE @Form1 UNIQUEIDENTIFIER=NEWID();
DECLARE @Form2 UNIQUEIDENTIFIER=NEWID();

DECLARE @tblForms TABLE(id UNIQUEIDENTIFIER,FormName VARCHAR(100));
INSERT INTO @tblForms VALUES(@Form1,'test1'),(@Form2,'test2');

DECLARE @tblFields TABLE(id UNIQUEIDENTIFIER,FormId UNIQUEIDENTIFIER,FieldName VARCHAR(100));
INSERT INTO @tblFields VALUES(NEWID(),@Form1,'test1.1'),(NEWID(),@Form1,'test1.2'),(NEWID(),@Form1,'test1.3')
                            ,(NEWID(),@Form2,'test2.1'),(NEWID(),@Form2,'test2.2'),(NEWID(),@Form2,'test2.3');

--These are "your original IDs"
SELECT frms.id,frms.FormName
      ,flds.id,flds.FieldName
FROM @tblForms AS frms
INNER JOIN @tblFields AS flds ON frms.id=flds.FormId ;                           

--Copy forms into a new table with an extra column
DECLARE @tblFormsNeu TABLE(id UNIQUEIDENTIFIER,FormName VARCHAR(100),myNewID UNIQUEIDENTIFIER);
INSERT INTO @tblFormsNeu
SELECT id,FormName,NEWID() FROM @tblForms;

SELECT frms.myNewID, frms.FormName
      ,NEWID() AS myNewFieldID,flds.FieldName
FROM @tblFormsNeu AS frms
INNER JOIN @tblFields AS flds ON frms.id=flds.FormId