zoukankan      html  css  js  c++  java
  • 动态SQL使用小结

    1.什么是动态SQL?

    静态 SQL:静态 SQL 语句一般用于嵌入式 SQL 应用中,在程序运行前,SQL 语句必须是确定的,例如 SQL 语句中涉及的列名和表名必须是存在的。静态 SQL 语句的编译是在应用程序运行前进行的,编译的结果会存储在数据库内部。而后程序运行时,数据库将直接执行编译好的 SQL 语句,降低运行时的开销。

    动态 SQL:动态 SQL 语句是在应用程序运行时被编译和执行的,例如,使用 DB2 的交互式工具 CLP 访问数据库时,用户输入的 SQL 语句是不确定的,因此 SQL 语句只能被动态地编译。动态 SQL 的应用较多,常见的 CLI 和 JDBC 应用程序都使用动态 SQL。

    http://www.360doc.com/content/09/1028/16/8411_7986235.shtml

    动态SQL的应用场景:

    1:普通SQL语句可以用Exec执行,但没有意义,反倒性能低下。

    2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

    2.重点.

    执行动态SQL有两种方法

    1.使用exec命令,语法:exec sql

    exec命令有两个用途,一个是用来执行存储过程,另一个是执行动态SQL

    用法1:无参数的exec动态SQL   

    exec ('select field2 from t1')

    点评:这样做其实没有意义,性能低,动态SQL最好用在数据库名,表名,字段名作为参数的时候的场景。那时必须用动态SQL才能执行。

    用法2:有参数的动态SQL

    declare @test nvarchar
    set @test='Field2'
    select @test from dbo.T1

    XJMHXW_Y9XF5[PM1N]IL)UH错误,出现结果的原因:估计是类型的原因

    declare @test1 sysname
    set @test1='Field2'
    select @test1 from dbo.T1

    {H9RDFF%4(O{D%CUX6NDZR2错误,原因:SQL在运行时,已经是应用程序运行以后了,所以@test1没有被编译为表的列名,这种情形必须用动态SQL才能达到效果。

    declare @test2 sysname
    set @test2='Field2'
    exec ('select '+ @test2+' from T1') 注意:执行动态sql,必须有这个括号。

    HF(R[16`0F8@I7CI6Q59`KC正确

    declare @test3 nvarchar(128)
    set @test3='Field2'
    exec ('select '+ @test3+' from T1')

    }0%QYRDI)$6}2Z0{@D[_%TH正确,原因是nvarchar(128) 和sysname等效

    参见:http://www.cnblogs.com/chenxizhang/archive/2009/04/15/1436764.html

    2.使用系统存储过程

    语法:exec excutesql  参数1,参数2,参数3

    其中参数1是要执行的动态SQL语句,参数2是输入的参数的定义,参数3是输入的参数的值

    2.1Demo:

    DECLARE @IntVariable INT,@SQLString NVARCHAR(500),@ParmDefinition NVARCHAR(500);
    SET @SQLString =N'SELECT * FROM T1 WHERE Field2 = @Field';--给需要执行的sql赋值
    SET @ParmDefinition = N'@Field int';--以字符串的形式给第二个参数赋值
    ET @IntVariable = 1;--给需要传入的参数赋值
    EXECUTE sp_executesql @SQLString, @ParmDefinition,@Field = @IntVariable;

    AUF[Y]Y@VH%KCLO@2B`97LN

    DECLARE @IntVariable INT,@SQLString VARCHAR(500),@ParmDefinition VARCHAR(500);
    SET @SQLString ='SELECT * FROM T1 WHERE Field2 = @Field';--给需要执行的sql赋值
    SET @ParmDefinition = '@Field int';--给需要传入的参数进行定义
    SET @IntVariable = 1;--给需要传入的参数赋值
    EXECUTE sp_executesql @SQLString, @ParmDefinition,@Field = @IntVariable;

    QQ截图20131028032715

    注意:执行sp_executesql ,它的3个参数必须是可以隐式转换为nvarchar类型的参数,否则报错。如果没有定义,可以在参数赋值的前面+N

    2.2 sp_executesql 的优点:

    sp_executesql 支持替换 Transact-SQL 字符串中指定的任何参数值,但 EXECUTE 语句不支持。因此,由 sp_executesql 生成的 Transact-SQL 字符串比那些由 EXECUTE 语句生成的字符串更加相似。SQL Server 查询优化器可能将 sp_executesql 的 Transact-SQL 语句与以前所执行的语句的执行计划相匹配,从而节省编译新的执行计划的开销。

    参考资料:

    http://msdn.microsoft.com/zh-cn/library/ms175170.aspx

    http://blog.csdn.net/Tercel99/article/details/2901550

    http://www.jcwcn.com/article-28686-1.html

    http://www.51testing.com/html/46/n-223846.html

  • 相关阅读:
    chkdsk磁盘修复命令工具怎么用,怎样运行chkdsk工具修复?
    phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接。您应该检查配置文件中的主机、用户名和密码
    APiCloud真机调试需要注意的几个问题
    QQ个人文件夹中的文件被占用,解决办法
    PHPExcel读取excel文件
    数据挖掘与机器学习
    什么是数据挖掘?
    数据挖掘相关的10个问题
    PhpStorm 快捷键大全 PhpStorm 常用快捷键和配置
    VirtualBox提示:错误,创建一个新任务失败,被召者解决办法
  • 原文地址:https://www.cnblogs.com/youchun/p/3388883.html
Copyright © 2011-2022 走看看