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

背景:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

解決方案:

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

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

2.      怎麼在存儲過程中做循環處理?

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

代碼:

 1.創建臨時表:

    

  1. IF OBJECT_ID('dbo.create_tempTable') IS NOT NULL
  2.     DROP PROC dbo.create_tempTable;
  3. GO
  4. CREATE PROC dbo.create_tempTable    
  5. AS  
  6.     CREATE TABLE ##tempexcel(
  7.         pjid char(6),--項目id
  8.         userid char(6),--用戶id
  9.         PRIMARY KEY(pjid, userid)
  10.     )   
  11. GO

2.具體操作的存儲過程:

  1. IF OBJECT_ID('dbo.Staff_insert') IS NOT NULL
  2.     DROP PROC dbo.Staff_insert;
  3. GO
  4. CREATE PROC dbo.Staff_insert
  5.     @temptableName nvarchar(20)--臨時表名
  6. AS 
  7. BEGIN
  8.     --用於實現循環的臨時表,intID列用於從1開始對記錄計數
  9.     CREATE TABLE #excelData(intID int identity(1,1),pjid char(6),userid char(6));
  10.     --將全局臨時表中的數據插入到臨時表中
  11.     INSERT INTO #excelData(pjid,userid) EXEC('SELECT pjid, userid FROM '+ @temptableName);
  12.     --計算記錄的個數
  13.     SELECT @count= COUNT(1) FROM #excelData;
  14.     --如果記錄存在,進入循環
  15.     IF(@count > 0)
  16.     BEGIN
  17.         SET @i = 1;--循環變量               
  18.         WHILE(@i <= @count)
  19.         BEGIN
  20.             -- 根據intid取出要操作的記錄
  21.             SELECT @pjid=pjid,@userid=userid FROM #excelData WHERE intID = @i;
  22.             --其他操作
  23.             --
  24.             --
  25.         END
  26.     END
  27. END
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章