1. 介紹說明
有時候在執行存儲過程后,需要獲取存儲過程返回的列表,然后進行相應操作的情況,或者執行動態語句,獲取返回結果的情況,通過EXEC ,sp_executesql可以實現該功能。
網上也有很多相關的讀取方式,這里做個總結,方便以后查閱使用
2. 建表測試腳本
IF OBJECT_ID('tbScore') IS NOT NULL DROP TABLE tbScore GO CREATE TABLE tbScore ( 姓名 VARCHAR(10) , 課程 VARCHAR(10) , 分數 INT, 日期 DATETIME ) GO INSERT INTO tbScore VALUES ( '張三', '語文', 74,GETDATE() ) INSERT INTO tbScore VALUES ( '張三', '物理', 93 ,GETDATE() ) INSERT INTO tbScore VALUES ( '李四', '語文', 74 ,GETDATE() ) INSERT INTO tbScore VALUES ( '李四', '數學', 84 ,GETDATE() ) INSERT INTO tbScore VALUES ( '李四', '物理', 94 ,GETDATE() ) GO
3. 例子演示
2.1 通過EXEC 執行動態語句返回結果
CREATE TABLE #tmpResult ( 姓名 VARCHAR(10) , 課程 VARCHAR(10) , 分數 INT, 日期 DATETIME ) GO DECLARE @SQL1 VARCHAR(1000) SET @SQL1 = 'SELECT [姓名],[課程],[分數],[日期] FROM tbScore' --將EXEC執行的結果寫入臨時表 INSERT INTO #tmpResult EXEC(@SQL1) SELECT * FROM #tmpResult --清理臨時表 IF OBJECT_ID('tempdb..#tmpResult') IS NOT NULL BEGIN DROP TABLE #tmpResult END
2.2 通過sp_executesql 執行動態語句獲取返回值
CREATE TABLE #tmpResult ( 姓名 VARCHAR(10) , 課程 VARCHAR(10) , 分數 INT, 日期 DATETIME ) GO DECLARE @SQL2 NVARCHAR(1000) DECLARE @Count INT SET @Count = 0 --(1)獲取單個返回值 SET @SQL2 = 'SELECT @RowNum = COUNT(0) FROM tbScore' EXEC sp_executesql @SQL2,N'@RowNum INT OUTPUT',@Count OUTPUT SELECT @Count --(2)獲取列表返回值 DELETE FROM #tmpResult --先清空數據 SET @SQL2 = 'SELECT [姓名],[課程],[分數],[日期] FROM tbScore' INSERT INTO #tmpResult EXEC sp_executesql @SQL2 SELECT * FROM #tmpResult --清理臨時表 IF OBJECT_ID('tempdb..#tmpResult') IS NOT NULL BEGIN DROP TABLE #tmpResult END
4. 參考資料
http://www.cnblogs.com/yinhaiming/articles/1544922.html