2009-06-25 75 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来获得类似的功能。

相关问题