获取动态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

原文地址:https://www.cnblogs.com/johden2/p/5730183.html