Sqlserver存儲過程—----傳遞數組、使用循環

背景:sql

前一段時間作過一個公司內部的員工項目管理系統,其間有個sqlserver存儲過程是要從excel文件中讀取員工的項目信息,並從db中找出相關的的其餘信息插入到一張員工表中。這裏涉及兩個難點:怎麼向存儲過程傳遞多條記錄?在存儲過程當中怎麼對這些記錄一條條循環處理。數組

解決方案:ide

1.      怎麼將excel中數據傳入到存儲過程當中?函數

存儲過程是沒有辦法接受數組參數的,個人作法是先把excel中的信息導入到一張全局的臨時表中,在把臨時表的表名傳遞給存儲過程,在存儲過程當中使用臨時表內容。sqlserver

2.      怎麼在存儲過程當中作循環處理?spa

在存儲過程當中新建一張臨時表,將傳遞過來的全局臨時表的信息保存在該表中,而且在表中添加一個id列,對記錄從一開始計數。使用count函數計算記錄的個數,使用while語句對id1count進行循環excel

代碼:code

 1.建立臨時表:orm

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.具體操做的存儲過程:server

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
相關文章
相關標籤/搜索