动态SQL语句使用心得
在我们的项目中经常需要用到分面功能,而我以前呢用的方法现在看起来都是那麽的笨拙,当时是这样做的,每当要进行数据分页时就专们针对那个表做分页,大家别笑,以前确实好笨。呵呵,虽然当时也有一个想法就是希望能够传入一张表进去进行操作,但那样的话编译是通不过的,因为FROM后面操作的是表变量,而不能是我们自定义的变量,所以当时没有深追究,现在为当时不深入学习而BS一下。
动态SQL需要准备以下内容:
1、@SQL 拼接后的SQL语句,可以是你任意需要的SQL语句如:SET @SQL='SELECT * FROM table WHERE ID=@id' 注意此处的@SQL必须且只能是NTEXT、NVARCHAR、NCHAR类型,如果是其它类型的话其它地方明明没有问题却会报 "过程需要类型为 'ntext/nchar/nvarchar' 的参数"这个错误。同时,如果这里需要传入表名称的话则应这样写:SET @SQL='SELECT * FROM '+@table+'WHERE ID=@id' ,因为上面传入的值是文本类型故会报错。
2、@parameters 所拼接的SQL语句里面的参数,按上面的话这里应该是:SET @parameters='@id INT' 同时这个参数的类型也必须且只能是NTEXT、NVARCHAR、NCHAR类型
3、调用:sp_executesql param1(,param2) 其中param1一般我们作为是@SQL,后面的参数则是我们在@sql中的参数了,但这里要注意的是传参的时候必须是对应的:
DECLARE @InputId INT ;
SET @InputId=1;
param2为:@id=@InputId;
以下是写的一个简单的通用分页,有需要可以自行修改:
ALTER PROCEDURE sp_pager
(
@TableName nvarchar(50), -- 表名
@ReturnFields nvarchar(200) = '*', -- 需要返回的列
@PageSize int = 50, -- 每页记录数
@PageIndex int = 1 -- 当前页码
)
AS
DECLARE @SQL NVARCHAR(1000)
DECLARE @paramters NVARCHAR(200)
BEGIN
SET NOCOUNT ON
SET @SQL='SELECT '+@ReturnFields+' FROM '+@TableName+' WHERE ID>(SELECT TOP 1 ID FROM (SELECT TOP '+CAST(@PageSize*@PageIndex AS VARCHAR)+' ID FROM '+@TableName+ ' ORDER BY ID )AS A ORDER BY ID DESC)'
PRINT @SQL
EXECUTE sp_executesql @SQL,@paramters,@columns=@ReturnFields
END
相关推荐
-
oracle中动态SQL使用详细介绍
1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理.通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式.
-
MySQL 存储过程中执行动态SQL语句的方法
drop PROCEDURE if exists my_procedure; create PROCEDURE my_procedure() BEGIN declare my_sqll varchar(500); set my_sqll='select * from aa_list'; set @ms=my_sqll; PREPARE s1 from @ms; EXECUTE s1; deallocate prepare s1; end;
-
基于Oracle的高性能动态SQL程序开发
正在看的ORACLE教程是:基于Oracle的高性能动态SQL程序开发. 摘要:对动态SQL的程序开发进行了总结,并结合笔者实际开发经验给出若干开发技巧. 关键词:动态SQL,PL/SQL,高性能 1. 静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输
-
mybatis的动态sql详解(精)
MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种情形,这种语言可以被用在任意映射的SQL语句中. 动态SQL元素和使用 JSTL或其他相似的基于XML的文本处理器相似.在MyBatis之前的版本中,有很多
-
编程经验点滴 动态SQL的拼接技巧
常见的误解有: 1. 只用 ado.net ,无法进行动态 SQL 拼接. 2. 有几个动态参数,代码的重复量就成了这些参数的不同数量的组合数,动态参数越多,重复量越大. 对于第二个问题,以下的错误代码为其证据: 复制代码 代码如下: if(id>0 && string.IsNullOrEmpty(name)) { command.CommandText = "select * from t1 where id=?"; command.Parameters.Add
-
sqlserver 支持定位当前页,自定义排序的分页SQL(拒绝动态SQL)
1,场景:根据学生编号查询,返回该学生所在班级的所有学生.支持分页.自定义排序及结果集自动定位到查询条件的学生编号所在页. 复制代码 代码如下: CREATE PROC [dbo].[Sp_testpagerandsorting] (@GroupID INT, @CurrentId INT, @TimeFrom DATETIME, @TimeTo DATETIME, @OrderBy CHAR(50), @PageSize INT, @CurrentPage INT) AS SET nocoun
-
批处理 动态sql
1. DECLARE TYPE ref_cursor_type IS ref CURSOR; v_mycursor ref_cursor_type; TYPE id_list IS TABLE OF integer; TYPE name_list IS TABLE OF varchar2(30); v_tabid id_list:=id_list(); v_tabname name_list:=name_list(); sql_str varchar2(200); BEGIN --查询所以行,放
-
为什么ASP中执行动态SQL总报错误信息?提示语句语法错误
问:为什么ASP中执行动态SQL总报错误信息?提示语句语法错误 答: 有时候写ASP用conn.execute(sql)查询.更新.插入Access数据库数据时,明明正确的语句却往往会显示sql语句错误,相当恼火,特进行了归纳,可适当为字段添加"["."]"解决: 复制代码 代码如下: 例1:select * from a 如出现错误,可改为:select * from [a] 例2:UPDATE [user] SET password = '"&am
-
mysql存储过程 在动态SQL内获取返回值的方法详解
MySql通用分页存储过程过程参数 复制代码 代码如下: p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4000),p_order varchar(100),p_pageindex int,p_pagesize int,out p_recordcount int,out p_pagecount int $:begin declare v_sqlcounts varchar(4000); declare v_s
-
动态SQL语句使用心得
在我们的项目中经常需要用到分面功能,而我以前呢用的方法现在看起来都是那麽的笨拙,当时是这样做的,每当要进行数据分页时就专们针对那个表做分页,大家别笑,以前确实好笨.呵呵,虽然当时也有一个想法就是希望能够传入一张表进去进行操作,但那样的话编译是通不过的,因为FROM后面操作的是表变量,而不能是我们自定义的变量,所以当时没有深追究,现在为当时不深入学习而BS一下. 动态SQL需要准备以下内容: 1.@SQL 拼接后的SQL语句,可以是你任意需要的SQL语句如:SET @SQL='SELECT * F
-
MySQL存储过程中实现执行动态SQL语句的方法
本文实例讲述了MySQL存储过程中实现执行动态SQL语句的方法.分享给大家供大家参考.具体实现方法如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE set_col_value -> (in_table VARCHAR(128), -> in_column VARCHAR(128), -> in_new_value VARCHAR(1000), -> in_where VARCHAR(4
-
MyBatis 执行动态 SQL语句详解
大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: <select id="executeSql" resultType="map"> ${_parameter} </select> 你可以如下调用: sqlSession.selectList("executeSql", "select * from sysuser where enabled
-
mybatis教程之动态sql语句_动力节点Java学院整理
有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selec
-
Mybatis模糊查询和动态sql语句的用法
Mybatis 模糊查询和动态sql语句 模糊查询 对数据库最常用的操作就是查询了,但是如何使用Mybatis进行模糊查询呢?下面先看一个简单的模糊查询 <select id="select01" resultMap="BasicResultMap"> SELECT * FROM oa_employee WHERE emp_name LIKE #{asd} </select> 这是一条伪模糊查询, 因为没有实现真正的模糊 "%&qu
-
Mybatis中的动态SQL语句解析
这篇文章主要介绍了Mybatis中的动态SQL语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Mybatis中配置SQL有两种方式,一种是利用xml 方式进行配置,一种是利用注解进行配置. Mybatis使用注解配置SQL,但是由于配置功能受限,而且对于复杂的SQL而言可读性很差,所以很少使用. Mybatis常用xml配置的方式,使用xml的几个简单的元素,便能完成动态SQL的功能,大量的判断都可以在mybaties的映射xml里面配
-
Mybatis超级强大的动态SQL语句大全
目录 1. If 语句 2. Where语句 2.1 和 where 元素等价的自定义 trim 元素 3. Set语句 3.1 与 set 元素等价的自定义 trim 元素 4. Choose语句 5. Foreach语句 6. SQL片段 7. Bind元素 附:MyBatis配置动态SQL语句 总结 1. If 语句 需求:根据作者名字和博客名字来查询博客!如果作者名字为空,那么只根据博客名字查询,反之,则根据作者名来查询 <!--需求1: 根据作者名字和博客名字来查询博客! 如果作者名字
-
SQL SERVER 中构建执行动态SQL语句的方法
1 :普通SQL语句可以用exec执行 Select * from tableName exec('select * from tableName') exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL declare @fname varchar(20) set @fname = 'FiledName' --Select @fname from tableName
-
MyBatis的动态SQL语句实现
1. 动态SQL之<if>标签 我们根据实体类的不同取值,使用不同的SQL语句来进行查询.比如在id如果不为空时可以根据id查询,如果username不为空时还要加入用户名作为条件,这种情况在我们的多条件组合查询中经常会碰到. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN&qu
-
如何优化SQL语句的心得浅谈
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.(2)WHERE子句中的连接顺序:Oracle采用自下而上的顺序解析WHERE子句,根据
随机推荐
- ACCESS学习日记
- Java 线程池详解
- 浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
- asp.net使用LINQ to SQL连接数据库及SQL操作语句用法分析
- Python修改Excel数据的实例代码
- Python实现包含min函数的栈
- Javascript的无new构建实例详解
- Asp实现假静态
- java中将科学计数法转换普通计数法的简单方法
- jQuery视差滚动效果网页实现方法经验总结
- 使用node.js 获取客户端信息代码分享
- Python中Scrapy爬虫图片处理详解
- C#使用SQL DataAdapter数据适配代码实例
- 浅谈Vue数据响应
- JavaScript 继承 封装 多态实现及原理详解
- Android中Retrofit的简要介绍
- jQuery 同时获取多个标签的指定内容并储存为数组
- Java中对null进行强制类型转换的方法
- JAVA学习笔记:注释、变量的声明和定义操作实例分析
- Java数组使用binarySearch()方法查找指定元素的实现