2013-05-01 148 views
1

任何人都可以告诉我如何在主键,外键重复多个插入 这是我所做的。 这是需要完成的部分内容。 StatusTable有大约200行。我正在尝试将此状态表的详细信息分成2- Table1,Table2。重复插入主键,外键

在将每条记录插入到Table1之后,我得到了Identity列,并且需要将其插入到Table2中并添加一些其他内容。所以如果在StatusTable中有200行,Table1,Table2中有200行。

但那不是它的工作方式。它将所有200行插入到Table1中,然后获取Identity,然后在Table2中插入一行。我知道它为什么这样做。但不知道如何解决它..

 INSERT INTO [dbo].[Table1] 
       ([UserID], 
       ,[FirstName].......) 
    SELECT 'User1' AS [UserID] 
       ,'FirstName' 
    FROM [dbo].[StatusTable] 

    SELECT @id = SCOPE_IDENTITY() 

    INSERT INTO [dbo].[Table2] 
       ([AccountID],[Status] 
      values (@id, 'S') 

请建议

+1

做每一对镶在一起。创建一个只进游标并读取StatusTable中的每一行。对于每一行,您都可以执行您当前正在执行的操作,即插入到Table1中,使用scope_identity获取ID,然后使用该ID将相应的记录插入到Table2中。 – DeanOC 2013-05-01 20:39:47

+0

ANY列中的数据(或列的组合),将使每行都是唯一的?在insert into table 2语句中,您可以在select语句中引用表1。 – Twelfth 2013-05-01 21:06:14

+0

用户如何区分一个'StatusTable'行而不使用标识值? “UserID”列是否必须是唯一的? 'UserID' +'FirstName'? 'UserID' +'名字'+'状态'? – Thomas 2013-05-01 22:17:02

回答

3

使用OUTPUT子句

DECLARE @IDS TABLE (id INT) 

INSERT INTO [dbo].[Table1] 
       ([UserID] 
       ,[FirstName]) 
    OUTPUT inserted.id INTO @IDS   
    SELECT 'User1' AS [UserID] 
       ,'FirstName' 
    FROM [dbo].[StatusTable] 

    INSERT INTO [dbo].[Table2] 
       ([AccountID],[Status]) 
     SELECT Id, 'S' FROM @IDS 
+0

我认为你可以跳过表格参数。 OUTPUT inserted.id,'S'INTO Table2(AccountId,Status) – 2013-05-01 22:21:58

0

在时间逻辑尝试一套基于方法取代这种单排。加载第一个表格,然后可以将插入中的第一个表格和数据表格引用到第二个表格,如果您有让每一行都是唯一的内容。

可以使用select语句,而不是一个值列表:

insert into table 
select rows from othertable (or multiple tables...it's a select statement as complicated as you wish) 

伪编码:

Insert into table2 (datacolumns) 
select table1.id, datacolumn 
from statustable s 
inner join table1 t 
on (whatever makes these rows unique) 
+1

这确实假定除了他们在可数据库中的PK之外,还有一些东西使得这些行是唯一的。如果不是,那么可以使用这种方法,但它需要将来自statustable的PK插入到表1中。并不困难,但在数据加载时,您只需关闭表1中的身份插入。 – DeanOC 2013-05-01 21:51:12

+0

正如我的回答包括“如果你有让每一行独一无二的东西”......是的,如果包含它,那么statustable中的任意PK将起作用。你可以在每一列加入它,只要数据是唯一的,当每列都被考虑时 – Twelfth 2013-05-02 20:26:50