2011-09-02 88 views
1

我有一个要求将多行插入到table1中,并同时将一行插入table2,pkIDtable1和一个来自SP参数的值。将批量行插入到SQL Server 2008中的两个表中

我创建了一个存储过程,该存储过程使用包含要插入到table1中的行的表值参数执行批量插入。但我有一个问题,将table2中的行插入到中,其中有与table1对应的Id(标识)以及我已经通过的参数值。

有没有人实施过这个,或者有什么好的解决方案呢?

CREATE PROCEDURE [dbo].[oSP_TV_Insert] 
    @uID int 
    ,@IsActive int 
    ,@Type int -- i need to insert this in table 2 
    ,@dTableGroup table1 READONLY -- this one is a table valued 
AS 

DECLARE @SQL varchar(2000) 
DECLARE @table1Id int 
BEGIN 

    INSERT INTO dbo.table1 
     (uID 
     ,Name 
     ,Contact 
     ,Address 
     ,City 
     ,State 
     ,Zip 
     ,Phone 
     ,Active) 
    SELECT 
     @uID 
     ,Name 
     ,Contact 
     ,Address 
     ,City 
     ,State 
     ,Zip 
     ,Phone 
     ,Active 
     ,@G_Active 
    FROM @dTableGroup 
--the above query will perform batch insert using the records from dTableGroup which is table valued 

SET @table1ID = SCOPE_IDENTITY() 

-- this below will perform inserting records to table2 with every Id inserted in table1. 

Insert into table2(@table1ID , @type) 
+0

你能后的代码,你认为什么是不正常?如果您在获取插入记录的标识值方面存在问题,那么'INSERT'具有'OUTPUT'子句,它将为您提供该值。 – a1ex07

+1

如果我已经正确理解你并且你在2008年看到[使用merge..output获取source.id和target.id之间的映射](http://stackoverflow.com/questions/5365629/using-merge-output- to-get-mapping-between-source-id-and-target-id) –

+0

是的,马丁,你是对的。 – user335160

回答

4

您需要临时存储的插入的标识值,然后创建第二个INSERT语句 - 使用OUTPUT条款。

喜欢的东西:

-- declare table variable to hold the ID's that are being inserted 
DECLARE @InsertedIDs TABLE (ID INT) 

-- insert values into table1 - output the inserted ID's into @InsertedIDs 
INSERT INTO dbo.table1(ID, Name, Contact, Address, City, State, Zip, Phone, Active) 
    OUTPUT INSERTED.ID INTO @InsertedIDs 
    SELECT 
     @ID, Name, Contact, Address, City, State, Zip, Phone, Active, @G_Active 
    FROM @dTableGroup 

,然后你可以有你的第二个INSERT语句:

INSERT INTO dbo.table2(Table1ID, Type) 
    SELECT ID, @type FROM @InsertedIDs 

上你可以用OUTPUT子句做更多详情请参见MSDN docs on the OUTPUT clause - 的一个最近使用不足和SQL Server最“未知”的功能!

+0

marc_s-非常感谢你。它的工作原理:) :) – user335160

1

使用OUTPUT子句,只有一个语句用于插入数据两个目标表另一种方法:

--Parameters 
DECLARE @TableGroup TABLE 
(
    Name NVARCHAR(100) NOT NULL 
    ,Phone VARCHAR(10) NOT NULL 
); 
DECLARE @Type INT; 
--End Of parameters 

--Destination tables 
DECLARE @FirstDestinationTable TABLE 
(
    FirstDestinationTableID INT IDENTITY(1,1) PRIMARY KEY 
    ,Name NVARCHAR(100) NOT NULL 
    ,Phone VARCHAR(10) NOT NULL 
); 
DECLARE @SecondDestinationTable TABLE 
(
    SecondDestinationTable INT IDENTITY(2,2) PRIMARY KEY 
    ,FirstDestinationTableID INT NOT NULL 
    ,[Type] INT NOT NULL 
    ,CHECK([Type] > 0) 
); 
--End of destination tables 

--Test1 
--initialization 
INSERT @TableGroup 
VALUES ('Bogdan SAHLEAN', '0721200300') 
     ,('Ion Ionescu', '0211002003') 
     ,('Vasile Vasilescu', '0745600800'); 
SET  @Type = 9; 

--execution 
INSERT @SecondDestinationTable (FirstDestinationTableID, [Type]) 
SELECT FirstINS.FirstDestinationTableID, @Type 
FROM 
(
INSERT @FirstDestinationTable (Name, Phone) 
OUTPUT inserted.FirstDestinationTableID 
SELECT tg.Name, tg.Phone 
FROM @TableGroup tg 
) FirstINS 

--check records 
SELECT * 
FROM @FirstDestinationTable; 
SELECT * 
FROM @SecondDestinationTable; 
--End of test1 

--Test2 
--initialization 
DELETE @TableGroup; 
DELETE @FirstDestinationTable; 
DELETE @SecondDestinationTable; 

INSERT @TableGroup 
VALUES ('Ion Ionescu', '0210000000') 
     ,('Vasile Vasilescu', '0745000000'); 
SET  @Type = 0; --Wrong value 

--execution 
INSERT @SecondDestinationTable (FirstDestinationTableID, [Type]) 
SELECT FirstINS.FirstDestinationTableID, @Type 
FROM 
(
INSERT @FirstDestinationTable (Name, Phone) 
OUTPUT inserted.FirstDestinationTableID 
SELECT tg.Name, tg.Phone 
FROM @TableGroup tg 
) FirstINS 

--check records 
DECLARE @rc1 INT, @rc2 INT; 
SELECT * 
FROM @FirstDestinationTable; 
SET  @rc1 = @@ROWCOUNT; 
SELECT * 
FROM @SecondDestinationTable; 
SET  @rc2 = @@ROWCOUNT; 
RAISERROR('[Test2 results] @FirstDestinationTable: %d rows; @@SecondDestinationTable: %d rows;',1,1,@rc1,@rc2); 
--End of test1 
+0

+1可组合的DML仅在SQL Server 2008上可用,但有很多限制。 –