网站首页 > 技术文章 正文
在介绍动态SQL前我们先看看什么是静态SQL
静态SQL
静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。
动态SQL
动态 SQL 语句是在应用程序运行时被编译和执行的,例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。
动态SQL作用
- 自动化管理任务。例如:对于数据库实例中的每个数据库,查询其元数据,为其执行BACKUP DATABASE语句。
- 改善特定任务的性能。例如,构造参数化的特定查询,以重用以前缓存过的执行计划。
- 对实际数据进行查询的基础上,构造代码元素。例如,当事先不知道再PIVOT运算符的IN子句中应该出现哪些元素时,动态构造PIVOT查询。
动态SQL执行方法
使用EXEC(EXECUTE的缩写)命令和使用SP_EXECUTERSQL。
EXEC命令执行
语法
EXECUTE (SQL语句)
注:EXECUTE 命令有两个用途,一个是用来执行存储过程,另一个是执行动态SQL
不带参数示例
在变量@SQL中保存了一个字符串,该字符串中包含一条查询语句,再用EXEC调用保存在变量中的批处理代码,我们可以这样写SQL:
EXEC ('SELECT * FROM Customers')
结果如下:
与我们直接执行SELECT * FROM Customers一样。
带参数示例
还是上面的示例,我们换一种写法
DECLARE @SQL AS VARCHAR(100); DECLARE @Column AS VARCHAR(20); SET @Column = '姓名' SET @SQL = 'SELECT ' + @Column + ' FROM Customers'; EXEC (@SQL)
结果如下:
SP_EXECUTERSQL执行
语法
EXEC SP_EXECUTERSQL 参数1,参数2,参数3
注意:SP_EXECUTERSQL是继EXEC后另一种执行动态SQL的方法。使用这个存储过程更加安全和灵活,因为它支持输入和输出参数。注意的是,与EXEC不同的是,SP_EXECUTERSQL只支持使用Unicode字符串作为其输入的批处理代码。
示例
构造了一个对Customers表进行查询的批处理代码,在其查询过滤条件中使用一个输入参数@CusID
DECLARE @SQL AS NVARCHAR(100); SET @SQL=N'SELECT * FROM Customers WHERE 客户ID=@CusID;'; EXEC SP_EXECUTESQL @STMT=@SQL, @PARMS=N'@CusID AS INT', @CusID=1;
结果如下:
代码中将输入参数取值指定为1,但即使采用不同的值在运行这段代码,代码字符串仍然保存相同。这样就可以增加重用以前缓存过的执行计划的机会。
批注
动态SQL在日常工作中可能接触的比较少,但是其功能是非常强大的,可以直接嵌套在代码里进行操作数据,但是也很容易出错,特别是在进行命令拼接时候要非常仔细。这里只是给大家简单介绍一下其使用方法,需要深入使用还需要多多研究。
猜你喜欢
- 2024-09-14 Mysql:替换某个字段中的部分字符串——replace函数
- 2024-09-14 plsql字符串分割浅谈(plsql字符串截取)
- 2024-09-14 oracle函数--INSTR、SUBSTR使用说明和实例讲解
- 2024-09-14 详解Oracle使用substr和instr截取字符串指定位置的字符
- 2024-09-14 mysql 替换某一个字段中的字符串(mysql替换一个字符串的字符函数为)
- 2024-09-14 sql注入总结(sql注入示例)
- 2024-09-14 Mybatis 中的 DAO 接口和 XML 文件里的 SQL他们如何建立关系?
- 2024-09-14 SQL Server - 字符串常用操作(sqlserver 字符类型)
- 2024-09-14 如何在Java中比较字符串?(如何在java中比较字符串个数)
- 2024-09-14 SQL截取函数(substr)与字符串查找函数(Instr)的组合应用
- 1512℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 556℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 504℃MySQL service启动脚本浅析(r12笔记第59天)
- 482℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 480℃启用MySQL查询缓存(mysql8.0查询缓存)
- 460℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 440℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 438℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)