一、對結果集使用的解決辦法
如何在預存程序中使用另一個預存程序的結果集,或者對動態SQL語句的執行結果再次使用,可以使用下面這樣的語句:
INSERT INTO table_name EXEC procedure_name @parameters_var
使用代碼如下:
--1 建立一個暫存資料表#tmp,表結構與目標預存程序procedure_name的返回結果集相容(相容即可,不必相同)。create table #tmp( [columns_list])--2.1 執行預存程序,並將預存程序的返回結果集插入暫存資料表。insert into #tmp exec procedure_name @parameters_var--2.2 對於動態sql語句的執行如下(如果直接通過exec執行動態sql語句,sql語句有4k的長度限制。)insert into #tmp exec dbo.sp_executesql @querystring_var--3 現在可以使用(過濾,更改或檢索)#tmp了。if exists(select * from #tmp) begin --執行分支1 end else begin --執行分支2 end--4 最後清除暫存資料表。drop table #tmp
思路2:建立一個函數返回需要的查詢結果集,然後在預存程序中當做table使用即可。
參考來源:在預存程序中如何使用另一個預存程序返回的結果集
二、對遊標的使用嘗試
下面是使用 SQL Server 遊標的一個樣本。首先,建立測試環境:
create table #tmp( ID int ,UserName varchar(12) )GOinsert into #tmp values(1,'aaaa');insert into #tmp values(2,'bbbb');insert into #tmp values(3,'aabb');insert into #tmp values(4,'bbaa');GOselect * from #tmpGO
使用代碼如下:
alter procedure Demoasbegin declare @tmpID int,@tmpName varchar(12); begin try -- 注意:有order by不能對select 語句使用括弧 declare cr cursor for select ID,UserName from #tmp order by ID; open cr; fetch next from cr into @tmpID,@tmpName; -- @@fetch_status 返回當前開啟的遊標的 FETCH 語句的狀態 while(@@fetch_status=0) begin print convert(varchar(6),@tmpID) + @tmpName; fetch next from cr into @tmpID,@tmpName; --讀取下一條資料 if(@tmpName = 'aabb') goto userGO; end; userGO: print '自訂GOTO語句跳轉'; close cr; -- 關閉遊標 deallocate cr; -- 釋放遊標 end try begin catch close cr; -- 關閉遊標 deallocate cr; -- 釋放遊標 print '異常處理!' end catchend;exec Demo
參考 MSDN 資源:http://msdn.microsoft.com/zh-cn/library/ms180169.aspx
(完)