在儲存過程中如何使用另乙個儲存過程返回的結果集

2021-07-09 17:16:28 字數 2231 閱讀 9508

在儲存過程中如何使用另乙個儲存過程返回的結果集

2012-10-19 10:44:39      收藏

在儲存過程中如何使用另乙個儲存過程返回的結果集

與這個問題具有相同性質的其他描述還包括:

如何在儲存過程中檢索動態sql語句的執行結果?

如何實現類似select * from (exec procedure_name @parameters_var) as datasource where ... 的功能?

procedure_name是乙個儲存過程的名字,@parameters_var是過程引數

如何將乙個儲存過程的執行結果記錄集傳遞給另乙個儲存過程?

儲存過程中如何根據另乙個儲存過程的執行結果選擇執行流程?

儲存過程中如何根據動態sql語句的查詢結果更改執行流程?

乙個儲存過程a使用另乙個儲存過程b的名字(或一段sql語句或乙個不確定的表名,欄位名)作為引數,如何在不改動儲存過程b的情況下,對儲存過程b的執行結果記錄集進行過濾/更改,再將過濾/更改後的結果集返回給儲存過程a的呼叫者?

www.2cto.com  

上面這些問題都有乙個共同點,那就是都希望對儲存過程(或動態sql語句)的執行結果進行再處理,但是標準的sql語句只能處理資料表,而乙個儲存過程(或動態sql語句)的執行結果雖然是記錄集,但它們本身不能當做資料表來處理。這樣就大大限制了儲存過程(或動態sql語句)的應用範圍,它們只能作為將記錄集返回給應用程式前的最後乙個處理層。如果我們可以像使用普通的資料表那樣使用儲存過程(或動態sql語句)該有多好。

這個問題我以前的解決方法是使用openquery()或opendatasource(),但openquery()不僅要求建立乙個鏈結伺服器,而且執行效能也讓人無法滿意。opendatasource()則要求提供連線字串,這對

系統後期的維護也是乙個很大的麻煩。

今天使用sql server聯機叢書時無意中發現了一條sql語句,竟然非常方便的解決了這個問題。這個語句就是insert語句。

insert語句在幫助中的定義是這樣的:

insert [ into]

[ ,...n] )

| derived_table

| execute_statement }

}| default values

其中execute_statement的解釋是"任何有效的 execute 語句,它使用 select 或 readtext 語句返回資料。"。通常我們放在這個位置的就是一段select語句。但幫助既然說"任何有效的 execute 語句",那麼"exec procedure_name"也應該可以羅?想到這一點,馬上決定動手驗證一下。驗證結果證實沒問題。即下面這樣的語句

insert into table_name exec procedure_name @parameters_var

確實可以正常工作。有了這個基礎,我們也就有了解決本文開頭那些問題的方法。

基本思路是先建立乙個臨時表,通過insert ... exec ...語句將儲存過程的返回結果儲存到臨時表中,接下來就可以像處理普通資料表那樣對待這個臨時表了。對於動態sql語句,可以通過dbo.sp_executesql儲存過程執行,或者直接作為exec的引數執行。具體的編寫要求可以參考sql server聯機叢書。這裡只特別說明一下,臨時表的表結構與儲存過程(或動態sql語句)返回的記錄集的表結構相容即可,不要求完全相同。如果直接通過exec執行動態sql語句,sql語句有4k的長度限制。

www.2cto.com  

最後給出兩種最常見的處理流程:

1。建立乙個臨時表#tmp,表結構與目標儲存過程procedure_name的返回結果集相容(相容即可,不必相同)。

create table #tmp(

[columns_list] )

2。執行儲存過程並將儲存過程的返回結果集插入臨時表。

insert into #tmp exec procedure_name @parameters_var

3。現在可以使用(過濾,更改或檢索)#tmp了。^_^

if exists(select * from #tmp)

begin

--執行分支1

end else begin

--執行分支2

end4。別忘了最後清除臨時表。

drop table #tmp

對於動態sql語句,只要將第二步改為

insert into #tmp exec dbo.sp_executesql @querystring_var

即可。

儲存過程中呼叫另乙個儲存過程的結果集

在乙個儲存過程中把另乙個儲存過程當乙個表來使用,在sql server中不支援直接從 後接儲存過程。這個時候我們可以利用臨時表來實現。舉例 select id,roleid,roletype into temppurviewtablecontainer from systempurview wher...

在乙個儲存過程裡面執行另乙個儲存過程的應用

alter procedure dbo voucheroutbound backinsurance add the parameters forthe stored procedure here iu id int,icc id int,ic id int,uv currentno varchar ...

SQL 儲存過程裡呼叫另乙個儲存過程

由於建立了乙個儲存過程,並且要在另乙個儲存過程裡呼叫這個儲存過程所以在網上找了一下相關的 現在總結一下,防止以後還會用到 由於這次我寫的儲存過程只需要返回乙個求和的結果,所以我使用了output 引數,即執行了儲存過程以後返回乙個值 具體 如下 create procedure dbo t1 tes...