Transact-SQL 示例 - 如何在拼接的动态sql内调用外部变量
任务需求是这样的,定义一个存储过程可以根据设定的存储过程参数去查询某个表返回可以分页的,参数的功能如下:
1.返回记录集的第n页(@pageNo)
2.每页显示n条记录(@pageSize)
3.筛选条件(@where)
4.排序规则(@orderby)
5.总记录数(@rows)
Ok,在拿到需求后,便开始分析。。。这里需要使用到拼接sql字符串变量然后Exec @sql即可,但是实践发现。Exec @sql并不能把总记录数传递给外部的@rows OUTPUT参数上,为此stackoverflow一番发现答案。
下面是本人目前的做法:
--定义存储过程
-- 示例过程中使用每个数据库都会自带的系统视图sys.objects作为测试用表
CREATE PROCEDURE dbo.Demo1@pageNo int = 1,@pageSize int = 10,@where nvarchar(1000) = N'',@orderby nvarchar(1000) = N'name asc',@rows int OUTPUT
AS
BEGINDECLARE @sql nvarchar(max)SET @sql = N'SELECT @rowsInner = COUNT(1) FROM sys.objects'IF @where <> N''SET @sql = @sql + N' WHERE ' + @whereSET @sql = @sql + N';SELECT *FROM (SELECT ROW_NUMBER() OVER(ORDER BY ' + @orderby + N') RowId,object_id,nameFROMsys.objects 'IF (@where <> N'')SET @sql = @sql + N'WHERE ' + @whereSET @sql = @sql + N') aWHEREa.RowId between (@pageNoInner - 1) * @pageSizeInner + 1 AND @pageNoInner * @pageSizeInner'--若要调试请撤销如下代码的注释并注释<code1/>处--SET @rows = 100--print @sql-- <code1>EXEC sp_executesql @sql, N'@pageNoInner int, @pageSizeInner int, @rowsInner int OUTPUT',@pageNoInner = @pageNo,@pageSizeInner = @pageSize,@rowsInner = @rows OUTPUT-- </code1>
END
以下为调用:
DECLARE @rows int
exec dbo.Demo1 2, 20, N'', N'object_id asc', @rows outprint @rows
实现的原理其实将原来的Exec @sql改用sp_executesql 注意该存储过程的第二个参数是定义动态变量,第三个参数开始便是设置动态变量的值。
转载于:https://www.cnblogs.com/highend/archive/2013/06/13/sp_executesql.html
Transact-SQL 示例 - 如何在拼接的动态sql内调用外部变量相关推荐
- mysql动态sql拼接_动态SQL(拼接)
Q1:什么是动态SQL呢? A1:首先是SQL语句,是根据条件来拼接SQL Q2:为什么要用动态SQL? A2:因为在条件WHERE中出现OR会导致不能使用索引,从而使效率差别巨大. 例如:如图1.2 ...
- 长sql和短sql加java区别_Mybatis下动态sql中##和$$的区别讲解
一.介绍 mybatis 中使用 Mapper.xml里面的配置进行 sql 查询,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user ...
- java 动态拼接sql_动态SQL拼接工具类
动态SQL拼接处理工具类,为了传动态参数sql语句拼接的灵活使用.具体源代码见: 下面简单介绍下使用Demo: public static void main(String[] args) throw ...
- java mysql 动态sql_Java下拼接运行动态SQL语句
Java拼接动态SQL的一般做法有 1.使用动态语句 非常多数据库都提供了处理动态SQL的语法,如Oracle的EXECUTE IMMEDIATE语句.MSSQL的EXEC和SP_EXECUTESQL ...
- mysql动态sql循环语句_mysql存储过程循环遍历sql结果集,并执行动态sql
/* 将其他几张表数据复制到一张总表中 */ DROP PROCEDURE IF EXISTS sp_customer; CREATE PROCEDURE sp_customer() BEGIN -- ...
- 怎么在oracle里执行sql语句,在Oracle中执行动态SQL的几种方法
在一般的sql操作中,sql语句基本上都是固定的,如: SELECT t.empno,t.ename FROM scott.emp t WHERE t.deptno = 20; 但有的时候,从应用的需 ...
- mysql 动态sql 解析_MyBatis详解5.动态SQL
字节跳动飞书内推! 北京.杭州.武汉.广州.深圳.上海,六大城市等你来投. 感兴趣的朋友可以私我咨询&内推,也可以通过链接直接投递! 海量HC,极速响应,快来和我成为同事吧. 今日头条.抖音. ...
- mysql存储过程执行动态sql返回结果,mysql存储过程执行动态sql语句并返回值
Java代码 set @sql='xxx'; prepare stmt from @sql; execute stmt; deallocate prepare stmt; select @curd1; ...
- 存储过程(数组参数、for循环、拼接的动态sql游标、merge into)
create or replace procedure SFGL_XF_ONE_ADD(p_njdm in varchar2,p_yxdm in varchar2,p_zydm in varchar2 ...
最新文章
- 【 FPGA 】虚拟时钟
- redis集群扩容和缩容_Full-Stack-Notes
- 把中缀表达式转化为后缀表达式
- JavaFX 2.0布局窗格– FlowPane和TilePane
- CoordinatorLayout 使用综述系列(一)
- compareto方法_Java ArrayList 的不同排序方法
- PC-用Windows XP自带的组策略加固操作系统
- 计算机配置交换机线缆线序,H3C S7500X-G系列交换机
- bzoj 4568 [Scoi2016]幸运数字
- 达梦数据库SQL查询报错不是 GROUP BY 表达式解决方法
- FZU2132 - LQX的作业(概率论)
- 嵌入式睡眠监控报警仪的研究及设计
- Linux上一键部署KMS
- 使用visDrone数据集训练yolov5检测器
- 服务器cpu型号后面的字母,Intel 至强 E3服务器CPU后缀解读
- 使用VS2012进行单元测试
- Wootrade 评级报告:B,展望稳定 | TokenInsight
- trips | python注释快捷键
- Xilinx Zynq UltraScale+ MPSoC 介绍
- local cell id和cell id区别