背景:sql
前一段時間作過一個公司內部的員工項目管理系統,其間有個sqlserver存儲過程是要從excel文件中讀取員工的項目信息,並從db中找出相關的的其餘信息插入到一張員工表中。這裏涉及兩個難點:怎麼向存儲過程傳遞多條記錄?在存儲過程當中怎麼對這些記錄一條條循環處理。數組
解決方案:ide
1. 怎麼將excel中數據傳入到存儲過程當中?函數
存儲過程是沒有辦法接受數組參數的,個人作法是先把excel中的信息導入到一張全局的臨時表中,在把臨時表的表名傳遞給存儲過程,在存儲過程當中使用臨時表內容。sqlserver
2. 怎麼在存儲過程當中作循環處理?spa
在存儲過程當中新建一張臨時表,將傳遞過來的全局臨時表的信息保存在該表中,而且在表中添加一個id列,對記錄從一開始計數。使用count函數計算記錄的個數,使用while語句對id從1到count進行循環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