获取动态SQL的返回结果
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