Sqlserver存储过程—----传递数组、使用循环

梦想的初衷 提交于 2019-12-16 10:03:51

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

背景:

前一段时间做过一个公司内部的员工项目管理系统,其间有个sqlserver存储过程是要从excel文件中读取员工的项目信息,并从db中找出相关的的其他信息插入到一张员工表中。这里涉及两个难点:怎么向存储过程传递多条记录?在存储过程中怎么对这些记录一条条循环处理。

解决方案:

1.      怎么将excel中数据传入到存储过程中?

存储过程是没有办法接受数组参数的,我的做法是先把excel中的信息导入到一张全局的临时表中,在把临时表的表名传递给存储过程,在存储过程中使用临时表内容。

2.      怎么在存储过程中做循环处理?

在存储过程中新建一张临时表,将传递过来的全局临时表的信息保存在该表中,并且在表中添加一个id列,对记录从一开始计数。使用count函数计算记录的个数,使用while语句对id1count进行循环

代码:

 1.创建临时表:

IF OBJECT_ID('dbo.create_tempTable') IS NOT NULL
    DROP PROC dbo.create_tempTable;
GO
CREATE PROC dbo.create_tempTable    
AS  
    CREATE TABLE ##tempexcel(
        pjid char(6),--项目id
        userid char(6),--用户id
        PRIMARY KEY(pjid, userid)
    )   
GO

2.具体操作的存储过程:

IF OBJECT_ID('dbo.Staff_insert') IS NOT NULL
    DROP PROC dbo.Staff_insert;
GO
CREATE PROC dbo.Staff_insert
    @temptableName nvarchar(20)--临时表名
AS 
BEGIN
    --用于实现循环的临时表,intID列用于从1开始对记录计数
    CREATE TABLE #excelData(intID int identity(1,1),pjid char(6),userid char(6));
    --将全局临时表中的数据插入到临时表中
    INSERT INTO #excelData(pjid,userid) EXEC('SELECT pjid, userid FROM '+ @temptableName);
    --计算记录的个数
    SELECT @count= COUNT(1) FROM #excelData;
    --如果记录存在,进入循环
    IF(@count > 0)
    BEGIN
        SET @i = 1;--循环变量               
        WHILE(@i <= @count)
        BEGIN
            -- 根据intid取出要操作的记录
            SELECT @pjid=pjid,@userid=userid FROM #excelData WHERE intID = @i;
            --其他操作
            --
            --
        END
    END
END


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!