用于层次结构数据库批量导入(Insert)的存储过程
编写这个简单的存储过程是由我正在做的一个项目需求引起的。它主要完成的功能是将两个级联表中的数据导入到另两个同结构的数据表中。
简化之后的数据库模型由四个表构成:
模型表m1
字段 | 数据类型 | 描述 |
m1_id | int | 模型id(PK) |
m1_name | varchar(50) | 模型名称 |
子模型表m2
字段 | 数据类型 | 描述 |
m2_id | int | 子模型id(PK) |
m1_id | int | 所属模型id(FK) |
m2_name | varchar(50) | 子模型名称 |
实例表i1
字段 | 数据类型 | 描述 |
i1_id | int | 实例id(PK) |
i1_name | varchar(50) | 实例名称 |
子实例表i2
字段 | 数据类型 | 描述 |
i2_id | int | 子实例id(PK) |
i1_id | int | 所属实例id(FK) |
i2_name | varchar(50) | 子实例名称 |
表m1和m2是父子的层次结构关系
表i1和表i2是也是父子的层次结构关系
在实际使用中i1,i2还会有其他的字段,它的其中一部分字段是由m1和m2导入的。这就是我要写一个存储过程要完成的功能。
为简单起见,上面所有的主键都是自增1的标识。
表关系图如下:
存储过程的代码如下,编译通过,测试成功!
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[sp_moduleInsert] -- Add the parameters for the stored procedure here @m1_id int, @i1_id int out AS DECLARE @m1_name varchar(50); BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here SELECT @m1_name=m1_name FROM m1 WHERE m1_id=@m1_id; INSERT INTO i1 (i1_name) VALUES (@m1_name) SELECT @i1_id=@@IDENTITY; INSERT INTO i2 (i1_id,i2_name) (SELECT @i1_id,m2_name FROM m2 WHERE m1_id=@m1_id); END