2009-06-18 55 views
1

我有兩個表,第一個表的主鍵是一個標識,第二個表的主鍵不是,但該鍵有外鍵約束回到第一個表的主鍵。將基於插入的設置設置爲1到0-1的關係表

如果我一次插入一條記錄,我可以使用Scope_Identity獲取剛插入到表1中的pk的值,我想將其插入到第二個表中。

我的問題是我有很多記錄來自選擇我想在兩個表中插入,我一直沒有能夠想到一套基於集的方式來做這些插入。

我目前的解決方案是使用遊標,在第一個表中插入,使用scope_identity獲取密鑰,插入到第二個表中,重複。

我是否缺少非遊標解決方案?

回答

2

是的,請在聯機叢書中查找輸出子句。

+0

這看起來很有希望,但是一個問題/問題。似乎需要輸出子句提供的足夠信息才能將輸出行唯一地匹配回輸入select中的正確行,以便我可以使用scope_identity值。這可能並不總是可用的。 – automatic 2009-06-18 13:44:58

0

本週我有這個問題:有人已經將一個無意義的代理鍵引入到使用自然鍵的模式中。毫無疑問,我會很快解決這個問題:)直到那時,我正在通過創建一個到INSERT的數據表來解決這個問題:這可能是一個永久或臨時基表或派生表(見下文),它應該適合無論如何,您對基於集合的解決方案的渴望。使用自然鍵上的IDENTITY列在該表和表之間使用連接來查找自動生成的值。這裏有一個簡單的例子:

CREATE TABLE Test1 
(
surrogate_key INTEGER IDENTITY NOT NULL UNIQUE, 
natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE 
); 

CREATE TABLE Test2 
(
surrogate_key INTEGER NOT NULL UNIQUE 
    REFERENCES Test1 (surrogate_key), 
data_col INTEGER NOT NULL 
); 

INSERT INTO Test1 (natural_key) 
SELECT DT1.natural_key 
    FROM (
     SELECT '0000000001', 22 
     UNION ALL 
     SELECT '0000000002', 55 
     UNION ALL 
     SELECT '0000000003', 99 
     ) AS DT1 (natural_key, data_col); 

INSERT INTO Test2 (surrogate_key, data_col) 
SELECT T1.surrogate_key, DT1.natural_key 
    FROM (
     SELECT '0000000001', 22 
     UNION ALL 
     SELECT '0000000002', 55 
     UNION ALL 
     SELECT '0000000003', 99 
     ) AS DT1 (natural_key, data_col) 
     INNER JOIN Test1 AS T1 
      ON T1.natural_key = DT1.natural_key; 
相關問題