背景:
前一段时间做过一个公司内部的员工项目管理系统,其间有个sqlserver存储过程是要从excel文件中读取员工的项目信息,并从db中找出相关的的其他信息插入到一张员工表中。这里涉及两个难点:怎么向存储过程传递多条记录?在存储过程中怎么对这些记录一条条循环处理。
解决方案:
1. 怎么将excel中数据传入到存储过程中?
存储过程是没有办法接受数组参数的,我的做法是先把excel中的信息导入到一张全局的临时表中,在把临时表的表名传递给存储过程,在存储过程中使用临时表内容。
2. 怎么在存储过程中做循环处理?
在存储过程中新建一张临时表,将传递过来的全局临时表的信息保存在该表中,并且在表中添加一个id列,对记录从一开始计数。使用count函数计算记录的个数,使用while语句对id从1到count进行循环
代码:
1.创建临时表:
01 |
IF OBJECT_ID( 'dbo.create_tempTable' ) IS NOT NULL |
02 |
DROP PROC dbo.create_tempTable; |
04 |
CREATE PROC dbo.create_tempTable |
06 |
CREATE TABLE ##tempexcel( |
09 |
PRIMARY KEY (pjid, userid) |
2.具体操作的存储过程:
01 |
IF OBJECT_ID( 'dbo.Staff_insert' ) IS NOT NULL |
02 |
DROP PROC dbo.Staff_insert; |
04 |
CREATE PROC dbo.Staff_insert |
05 |
@temptableName nvarchar(20) |
09 |
CREATE TABLE #excelData(intID int identity(1,1),pjid char (6),userid char (6)); |
11 |
INSERT INTO #excelData(pjid,userid) EXEC ( 'SELECT pjid, userid FROM ' + @temptableName); |
13 |
SELECT @ count = COUNT (1) FROM #excelData; |
21 |
SELECT @pjid=pjid,@userid=userid FROM #excelData WHERE intID = @i; |