一、對結果集使用的解決辦法
如何在存儲過程中使用另一個存儲過程的結果集,或者對動態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) ) GO insert into #tmp values(1,'aaaa'); insert into #tmp values(2,'bbbb'); insert into #tmp values(3,'aabb'); insert into #tmp values(4,'bbaa'); GO select * from #tmp GO
使用代碼如下:
alter procedure Demo as begin 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 catch end; exec Demo
參考 MSDN 資源:http://msdn.microsoft.com/zh-cn/library/ms180169.aspx
(完)