2013-05-01 149 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