SQL高级知识V2——动态SQL

简介: 在介绍动态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')

    结果如下:

    11.jpg

    与我们直接执行SELECT * FROM Customers一样。


    带参数示例

    还是上面的示例,我们换一种写法

    12.png

    结果如下:

    13.jpg

    SP_EXECUTERSQL执行

    语法

    EXEC SP_EXECUTERSQL  参数1,参数2,参数3


    注意:SP_EXECUTERSQL是继EXEC后另一种执行动态SQL的方法。使用这个存储过程更加安全和灵活,因为它支持输入和输出参数。注意的是,与EXEC不同的是,SP_EXECUTERSQL只支持使用Unicode字符串作为其输入的批处理代码。


    示例

    构造了一个对Customers表进行查询的批处理代码,在其查询过滤条件中使用一个输入参数@CusID

    14.png

    结果如下:

    15.jpg


    代码中将输入参数取值指定为1,但即使采用不同的值在运行这段代码,代码字符串仍然保存相同。这样就可以增加重用以前缓存过的执行计划的机会。


    批注

    动态SQL在日常工作中可能接触的比较少,但是其功能是非常强大的,可以直接嵌套在代码里进行操作数据,但是也很容易出错,特别是在进行命令拼接时候要非常仔细。这里只是给大家简单介绍一下其使用方法,需要深入使用还需要多多研究。


    相关文章
    |
    7月前
    |
    SQL Java 编译器
    SQL 语言:嵌入式 SQL 和动态 SQL
    SQL 语言:嵌入式 SQL 和动态 SQL
    121 4
    |
    8月前
    |
    SQL Java 关系型数据库
    Mybatis多表关联查询与动态SQL(下)
    Mybatis多表关联查询与动态SQL
    145 0
    |
    6月前
    |
    SQL Java 数据库连接
    mybatis动态SQL常用语法总结
    MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
    119 7
    |
    6月前
    |
    SQL 数据处理 数据库
    SQL SELECT语句的高级应用与技巧
    SQL SELECT语句的高级应用与技巧
    |
    7月前
    |
    SQL 存储 Java
    SQL数据库学习指南:从基础到高级
    SQL数据库学习指南:从基础到高级
    |
    7月前
    |
    SQL XML 数据库
    后端数据库开发高级之通过在xml文件中映射实现动态SQL
    后端数据库开发高级之通过在xml文件中映射实现动态SQL
    70 3
    |
    7月前
    |
    SQL XML Java
    MyBatis第四课动态SQL
    MyBatis第四课动态SQL
    |
    7月前
    |
    SQL XML Java
    Mybatis进阶——动态SQL(1)
    Mybatis进阶——动态SQL(1)
    53 3
    |
    7月前
    |
    SQL 存储 关系型数据库
    17. Mysql 动态SQL
    17. Mysql 动态SQL
    114 1
    |
    6月前
    |
    SQL 存储 Java
    SQL数据库学习指南:从基础到高级
    SQL数据库学习指南:从基础到高级