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

时间: 2024-10-07 01:34:50

获取动态SQL的返回结果的相关文章

获取动态SQL查询语句返回值(sp_executesql)

在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值查询Cost值(表名不确定但表结构确定,如下面的Product表) 如果不考虑获取返回值,我们这样写即可: declare @tableName varchar(50) declare @id varchar(10) declare @cost numeric(18,2) declare @sql

sql server2008 获取动态sql的变量值

--通过SQL 字符串 查询 获取查出的值sp_executesql declare @QuerySql nvarchar(500),@uid int,@Ucode varchar(100);set @QuerySql='select @uid=iuserid,@Ucode=cusercode from sys_user where iuserid=1'exec sp_executesql @QuerySql,N'@uid int output,@Ucode varchar(200) outpu

sql server 获取动态sql输出结果

不带输出结果 我们一般会这样写 例子:一个输出6位递增号码结果 ALTER proc GetCode @tb varchar(50), @tag varchar(50) as declare @sqlstring nvarchar(max) set @sqlstring=' SELECT '''+@tag+'''+RIGHT(1000001+ISNULL(RIGHT(MAX(FCode),6),0),6) FROM '+@tb --print @sqlstring exec (@sqlstrin

在PL/SQL使用游标获取数据及动态SQL

1.游标概念: 当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针 2.  游标分类: A.  隐式游标 a.  在PL/SQL中使用DML语句时自动创建隐式游标 b.  隐式游标自动声明.打开和关闭,其名为 SQL c.  通过检查隐式游标的属性可以获得最近执行的DML 语句的信息 d.  隐式游标的属性有: %FOUND – SQL 语句影响了一行或多行时为 TRUE %NOTFOUND – SQL 语句没有影响任

(转)[SQL Server] 动态sql给变量赋值(或返回值给变量)

本文转载自:http://blog.csdn.net/xiaoxu0123/article/details/5684680 [SQL Server] 动态sql给变量赋值(或返回值给变量) declare @i_counts int, @i_times int; set @str_sql = 'select @tmp_counts = counts, @tmp_times=times ' + ' from ' +@str_dbname+ '.dbo.t_msisdn with(nolock) '

动态SQL实现与注意事项(有返回值与无返回值动态SQL 实现)

1.分类 当执行的SQL语句需传入变量时,必须使用SQL 动态语句实现: 动态语句分两种情况: (1)有返回值动态SQL (2)无返回值动态SQL 2.实现 假设存在一个学生表,具有UserID, UserName两列,属性为INT 与VARCHAR(20) 2.1 普通SQL 语句实现 SELECT UserID, UserName FROM StdTable WHERE UserID=123; 2.2 动态SQL 实现 --根据输入的ID查询出相应数据 DECLARE @ID INT DEC

MyBatis4:动态SQL

什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的省略逗号,动态SQL可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中. 动态SQL元素和使用JSTL或其它相似的基于XML的文本处理器相似,在MyBatis之前的版本中,有很多元素需

mybaits深入浅出之动态 SQL(四)

上一篇文章:  mybaits入门demo映射文件详解(三) 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL 能力.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 字符串有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意映射的 SQ

MyBatis学习(三)、动态SQL语句

三.动态SQL语句 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使