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
