扩展SQL的灵活性——静态T_SQL和动态SQL

其实我觉得这个博客写在基于web的应用程序开发是最好的,因为目前我们很少在客户端实现排序和过滤功能,而且很多开发采用的都是轻量级的两层模型,所以缺少专门处理数据缓冲和过滤业务,有些人会说,我们可以创建存储过程或者嵌套复杂的控制流程块?但是我想说,这些方案只能解决一部分问题,但是它们带来的问题远远比我想解决的问题要多得多。

问题

出现这个问题是在我们机房合作通过业务逻辑层来拼接字符串来优化D层代码的时候,但是出现这样一个问题:我这里写好了update一张表的所有字段,但是事实上传入的实体值一般仅仅是其中的几个字段,这就需要扩展我们SQL的灵活性。

解决过程

在合作中我是负责D层的,但是如何解决这个问题我还是无从下手。后来通过查询很久的资料和论坛的提问,大体了解是关于静态SQL和动态SQL的方向。

1. 静态T_SQL解决方法:

update card set cardName=isnull(@cardName,cardName),date=isnull(@date,date),Time=isnull(@Time,time),status=isnull(@status,status)
where [email protected]

由上面这段代码可以看到只是需要加上一个isnull()判断。当然方法不只是一个,比如通过控制流的判断,但是控制流判断还是存在很多潜在问题,也可以用case表达式,我觉得这种方法是在优化控制流来达到如果cardname为空时候,这个字段就保持原来数据,不进行改变。

上面的语句问题:可读性差。

可以通过case表达式来优化:

update card set cardName=case when @cardName is null then cardName else @cardName end

,date=case when @date is null then date else @date end

,Time=case when @Time is null then Time else @Time end

,status=case when @status is null then status else @status end

where [email protected]

这样子的使用CASE表达式替代SQL Server中的动态SQL语句。

2. 动态SQL解决方法

原理:拼接的SQL语句,在存储过程中。

注意:

所以说一般不建议使用动态SQL。

exec sp_executesql N'update card set cardName=isnull(@cardName,cardName),date=isnull(@date,date),Time=isnull(@Time,Time),status=isnull(@status,status)
 where [email protected]',N'@cardName varchar(100),@date date,@Time time,@status varchar(30),@cardID int','test',null,null,null,'001'

然后exec(sql)就可以了。

感悟

关于动态SQL知识一是我理解的不多,所以我也不大敢轻易的解读,以后在我学习的过程中我再把我的理解写出来;二是这对我来说是个新知识,需要时间消化和吸收,需要更多的和别人讨论才能决定是否运用动态SQL。

另外,通过这次出现的问题让我重新对sql sever有了理解,我曾经以为我学了视图,触发器,就已经差不多了,但是即使是小小的sql语句都有这么大学问,不过我觉得满有意思的,就是因为丰富,我每天对曾经学过的知识才会有全新的感受。我觉得sql sever不会学完,永远都在学习中,知识也是,永远都在学习中。

时间: 2025-01-14 09:29:46

扩展SQL的灵活性——静态T_SQL和动态SQL的相关文章

在PL/SQL使用游标获取数据及动态SQL

1.游标概念: 当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针 2.  游标分类: A.  隐式游标 a.  在PL/SQL中使用DML语句时自动创建隐式游标 b.  隐式游标自动声明.打开和关闭,其名为 SQL c.  通过检查隐式游标的属性可以获得最近执行的DML 语句的信息 d.  隐式游标的属性有: %FOUND – SQL 语句影响了一行或多行时为 TRUE %NOTFOUND – SQL 语句没有影响任

学习笔记-静态SQL和动态SQL

一:静态SQL 在编写pl/sql程序的时候,sql语句已经编写好了(编译时确定) ddl和会话控制语句不能在pl/sql中直接使用 二:动态SQL 在编写pl/sql程序的时候,sql语句还不确定 不编译,执行时动态确定 需要根据用户输入参数动态确定SQL语句 解决pl/sql中不支持ddl语句的问题 动态SQL语法: EXECUTE  IMMEDIATE  ‘DDL,DML语句’  ---sql语句是字符串的形式,sql语句中若有参数,可以:参数名使用 [INTO 〈变量序列〉]      

动态SQL、绑定变量、静态SQL的性能对比

1.测试样例 下面的三个存储过程,分别使用了动态SQL.绑定变量.静态SQL三种编程方式.具体存储过程内容如下: 1)动态SQL create or replace procedure proc1 as begin for i in 1 .. 100000 loop execute immediate 'insertinto t values (' || i || ')'; commit; end loop; end proc1; 2)绑定变量 create or replace procedu

oracle中动态SQL使用详细介绍

Oracle编译PL/SQL程序块分为两个种:通常静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式,需要了解的朋友可以参考下 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进

Oracle 动态SQL语句

Oracle 动态SQL语句 (2012-06-18 16:36:12) 转载▼ 标签: oracle it   EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包. 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTEIMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTEIMMEDIATE,因为它获的收益在包

Oracle中动态SQL详解

1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理.通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式.

(转)Oracle中动态SQL详解

本文转载自:http://www.cnblogs.com/gaolonglong/archive/2011/05/31/2064790.html 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程

Oracle中动态SQL详解(EXECUTE IMMEDIATE)

Oracle中动态SQL详解(EXECUTE IMMEDIATE) 2017年05月02日 18:35:48 悠悠倾我心 阅读数:744 标签: oracle动态sqloracle 更多 个人分类: 数据库 Oracle中动态SQL详解 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运

T-SQL动态查询(4)——动态SQL

接上文:T-SQL动态查询(3)--静态SQL 前言: 前面说了很多关于动态查询的内容,本文将介绍使用动态SQL解决动态查询的一些方法. 为什么使用动态SQL: 在很多项目中,动态SQL被广泛使用甚至滥用,很多时候,动态SQL又确实是解决很多需求的首选方法.但是如果不合理地使用,会导致性能问题及无法维护.动态SQL尤其自己的优缺点,是否使用需要进行评估分析: 动态SQL优点: 动态SQL提供了强大的扩展功能,能够应付复杂的需求,即使在需求增加时也能应对,并且不会因为需求的增加而导致代码的线性增长