我试图编写一个存储过程,它接受一个表类型参数并一次插入两个表。
我有一个实体表,它是一个保存各种表的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