2012-07-29 182 views
4

對於表AI每條記錄要更新基於新插入的記錄的SCOPE_IDENTITY表B.更新記錄的外鍵字段基於新插入的記錄的主鍵

我需要的領域之一的外鍵值爲表A中的每個記錄創建表B中的新記錄以便接收外鍵(scope_identity)值。

例如,對於下表中的每一行我想基於表創建一個新的行/外鍵B.

表A更新空外鍵字段:

|Id|ForeignKey| 
|1 |NULL  | 
|2 |NULL  | 
|3 |NULL  | 
|4 |NULL  | 
|5 |NULL  | 

作爲一個僞代碼,我想到了像這樣的SQL:

update TableA 
set ForeignKey = (INSERT INTO TableB VALUES (value1) select SCOPE_IDENTITY()) 

任何想法?

+0

對不起,我錯過了這個信息。刪除評論。 – Sebas 2012-07-29 16:16:27

回答

4

您可以使用遊標來遍歷表A和創建記錄:

DECLARE @Id int 
DECLARE @ForeignKey int 

DECLARE C CURSOR FOR SELECT Id FROM TableA 

OPEN C 

FETCH NEXT FROM C INTO @Id 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    INSERT INTO TableB VALUES (value1) 
    SET @ForeignKey = SCOPE_IDENTITY() 

    UPDATE TableA 
    SET ForeignKey = @ForeignKey 
    WHERE Id = @Id 

    FETCH NEXT FROM C INTO @Id 
END 

CLOSE C 
DEALLOCATE C 
0

的基於集合的方式做在SQL Server 2008中的INSERT相關的UPDATE,後來是使用MERGE...OUTPUT聲明。

-- This table variable will hold the correlation between the two tables 
declare @NewLinks table (dst_id int, src_id int) 

merge TableB dst 
using TableA src 
    on 1 = 0 --inserts all from src into dst, add WHERE-like limit here 
when not matched --should never match, since this is an INSERT-like query 
    insert (<dst_column_list>) values (<src_column_list>) 
output INSERTED.<dst_surrogate_key>, src.<src_surrogate_key> 
into @NewLinks 

update src 
set src.ForeignKey = nl.dst_id 
from TableA src 
join @NewLinks nl 
    on nl.src_id = src.Id 

由於INSERT語句(即使在INSERT ... SELECT形式)不具有FROM子句,from_table_name不能在其輸出子句來獲取完整的相關引用。由於MERGE始終將其USING子句視爲FROM子句,因此它可用於模擬INSERT ... SELECT構造,同時允許訪問OUTPUT中的源表和目標表。

使用MERGE ... OUTPUT創建與INSERT相關的UPDATE替換了使用遊標或循環的RBAR解決方案的低效使用與維護單個臨時表或表值變量。

相關問題