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