SQL Server:从表类型参数中将多行插入多个表

时间:2014-10-30 20:34:34

标签: sql-server stored-procedures

我试图编写一个存储过程,它接受一个表类型参数并一次插入两个表。

我有一个实体表,它是一个保存各种表的id的基表,下面是实体表和示例Site表。

------ Entity Table ------------------------------------------
| Id              | bigint        | NOT NULL | IDENTITY(1,1) | PRIMARY KEY
| TypeId          | tinyint       | NOT NULL | 
| Updated         | datetime      | NULL     | 
| Created         | datetime      | NOT NULL | 
| IsActive        | bit           | NOT NULL | 

------- Site Table ---------------------------------------
| EntityId        | bigint        | NOT NULL | PRIMARY KEY
| ProductTypeCode | nvarchar(8)   | NOT NULL | PRIMARY KEY 
| SupplierCode    | nvarchar(8)   | NOT NULL | PRIMARY KEY
| Name            | nvarchar(128) | NOT NULL | 
| Description     | nvarchar(max) | NULL     | 

这是我用于传入存储过程的表类型

------- Site Table Type ----------------------------------
| EntityTypeId    | tinyint       | NOT NULL |
| ProductTypeCode | nvarchar(8)   | NOT NULL | PRIMARY KEY
| SupplierCode    | nvarchar(8)   | NOT NULL | PRIMARY KEY
| Name            | nvarchar(128) | NOT NULL |
| Description     | nvarchar(max) | NULL     |

我的想法是,我将一个表类型参数传入存储过程并一次插入多行以保存循环,一次插入一行。

这是我到目前为止所拥有的

CREATE PROCEDURE InsertSites
    @Sites SiteTypeTable READONLY
AS
BEGIN

-- Insert into Entity & Site Tables here, using the Id from the Entity Table in the Site table

    INSERT INTO Entity (TypeId, Updated, Created, IsActive)
    OUTPUT [inserted].[Id], S.ProductTypeCode, S.SupplierCode, S.Name, S.Description
    INTO Site
    SELECT EntityTypeId, NULL, GETDATE(), 1
    FROM @Sites S

END

我已经阅读过有关一起使用插入和输出的信息,但无法使其正常工作。我也读过关于合并的内容,但也无法让它发挥作用。

非常感谢您提供的任何帮助或指示。

由于

尼尔

----编辑----

我可以这样做吗?我不知道如何完成这个......

CREATE PROCEDURE InsertSites
    @Sites SiteTypeTable READONLY
AS
BEGIN

    -- First insert enough rows into Entity table, saving the inserted Ids to a table variable

    DECLARE @InsertedOutput TABLE (EntityId bigint)

    INSERT INTO Entity (TypeId, Updated, Created, IsActive)
    OUTPUT [inserted].[id]
    INTO @InsertedOutput
    SELECT EntityTypeId, NULL, GETDATE(), 1
    FROM @Sites S

    -- Use the Ids in @InsertedOutput against the rows in @Sites to insert into Sites

END

0 个答案:

没有答案