2009-06-25 72 views
5

如果我有2個表,請將它們稱爲TableA和TableB。 TableB包含一個引用TableA的外鍵。我現在需要爲給定場景添加數據到TableA和TableB。爲此,我首先必須在TableA中插入數據,然後查找並檢索TableA的最後插入的主鍵,並將其用作TableB中的外鍵值。然後我在TableB中插入值。這似乎只是爲了插入一組數據而做的工作。我還能怎麼做到這一點?如果可能的話,請爲我提供SQL Server 2005的SQL語句。如何將數據添加到通過外鍵鏈接的兩個表中?

回答

4

這聽起來是正確的。請注意,您可以基於每行使用SCOPE_IDENTITY(),或者如果使用INSERT/OUTPUT語法,然後加入第一個插入的輸出集合,則可以執行基於集合的操作 - 例如,在這裏我們只有1 INSERT(each)into「real」tables:

/*DROP TABLE STAGE_A 
DROP TABLE STAGE_B 
DROP TABLE B 
DROP TABLE A*/ 
SET NOCOUNT ON 

CREATE TABLE STAGE_A (
    CustomerKey varchar(10), 
    Name varchar(100)) 
CREATE TABLE STAGE_B (
    CustomerKey varchar(10), 
    OrderNumber varchar(100)) 

CREATE TABLE A (
    Id int NOT NULL IDENTITY(51,1) PRIMARY KEY, 
    CustomerKey varchar(10), 
    Name varchar(100)) 
CREATE TABLE B (
    Id int NOT NULL IDENTITY(1123,1) PRIMARY KEY, 
    CustomerId int, 
    OrderNumber varchar(100)) 

ALTER TABLE B ADD FOREIGN KEY (CustomerId) REFERENCES A(Id); 

INSERT STAGE_A VALUES ('foo', 'Foo Corp') 
INSERT STAGE_A VALUES ('bar', 'Bar Industries') 
INSERT STAGE_B VALUES ('foo', '12345') 
INSERT STAGE_B VALUES ('foo', '23456') 
INSERT STAGE_B VALUES ('bar', '34567') 

DECLARE @CustMap TABLE (CustomerKey varchar(10), Id int NOT NULL) 

INSERT A (CustomerKey, Name) 
OUTPUT INSERTED.CustomerKey,INSERTED.Id INTO @CustMap 
SELECT CustomerKey, Name 
FROM STAGE_A 

INSERT B (CustomerId, OrderNumber) 
SELECT map.Id, b.OrderNumber 
FROM STAGE_B b 
INNER JOIN @CustMap map ON map.CustomerKey = b.CustomerKey 

SELECT * FROM A 
SELECT * FROM B 
+0

謝謝馬克......這正是我正在尋找的......這是在我的永久書籤上。 – 2014-08-05 19:42:03

1

如果你直接使用SQL,你有正確的解決方案。

如果你正在執行從代碼插入,你可能有更高層次的結構,可以幫助你實現這一點(LINQ,Django模型等)。

1

如果你打算在直接SQL中這樣做,我建議創建一個將所有數據作爲參數的存儲過程,然後在事務中執行插入/選擇標識/插入步驟。儘管該過程仍然與手動插入相同,但使用存儲過程將使您可以更輕鬆地從代碼中使用它。正如@Rax提到的,您也可以使用ORM來獲得類似的功能。

相關問題