如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集
如何在SQL?Server查詢語句(Select)中檢索存儲過程(Store?Procedure)的結果集?(2006-12-14 09:25:36)
與這個問題具有相同性質的其他描述還包括:
如何在SQL Server存儲過程中獲取另一存儲過程的執行結果記錄集?
如何在存儲過程中檢索動態SQL語句的執行結果?
如何實現類似SELECT * FROM (EXEC procedure_name @parameters_var) AS datasource ... 的功能?procedure_name是一個存儲過程的名字,@parameters_var是過程參數列表
如何將一個存儲過程的執行結果記錄集傳遞給另一個存儲過程?
存儲過程中如何根據另一個存儲過程的執行結果選擇執行流程?
存儲過程中如何根據動態SQL語句的查詢結果更改執行流程?
一個存儲過程A使用另一個存儲過程B的名字(或一段SQL語句或一個不確定的表名,字段名)作為參數,如何在不改動存儲過程B的情況下,對存儲過程B的執行結果記錄集進行過濾/更改,再將過濾/更改后的結果集返回給存儲過程A的調用者?
這個問題我以前的解決方法是使用OPENQUERY()或OPENDATASOURCE(),但OPENQUERY()不僅要求建立一個鏈接服務器,而且執行性能也讓人無法滿意。OPENDATASOURCE()則要求提供連接字符串,這對系統后期的維護也是一個很大的麻煩。
今天使用SQL Server聯機叢書時無意中發現了一條SQL語句,竟然非常方便的解決了這個問題。這個語句就是INSERT語句。
INSERT語句在幫助中的定義是這樣的: INSERT [ INTO]
??? { table_name WITH ( < table_hint_limited > [ ...n ] )
??????? | view_name
??????? | rowset_function_limited
??? } {??? [ ( column_list ) ]
??????? { VALUES
??????????? ( { DEFAULT | NULL | expression } [ ,...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_value 確實可以正常工作。有了這個基礎,我們也就有了解決本文開頭那些問題的方法。 基本思路是先創建一個臨時表,通過INSERT ... EXEC ...語句將存儲過程的返回結果保存到臨時表中,接下來就可以像處理普通數據表那樣對待這個臨時表了。對于動態SQL語句,可以通過dbo.sp_executesql存儲過程執行,或者直接作為EXEC的參數執行。具體的編寫要求可以參考SQL Server聯機叢書。這里只特別說明一下,臨時表的表結構與存儲過程(或動態SQL語句)返回的記錄集的表結構兼容即可,不要求完全相同。如果直接通過EXEC執行動態SQL語句,SQL語句有4K的長度限制。
最后給出兩種最常見的處理流程:
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
??? END 或者 SELECT * FROM #tmp WHERE ...
4。別忘了最后清除臨時表。
??? DROP TABLE #tmp 對于動態SQL語句,只要將第二步改為
??? INSERT INTO #tmp EXEC dbo.sp_executesql @querystring_value
即可。
轉載于:https://www.cnblogs.com/zxh1141/archive/2013/02/16/2913609.html
總結
以上是生活随笔為你收集整理的如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL SERVER 2012 Alwa
- 下一篇: VUE插件总结