所谓的动态sql,就是在t-sql字符串内的sql,而静态sql就是直接写在t-sql 存储过程内的。动态sql的好处是可以写出非常复杂的,表达能力很强的sql,并且,因为某些条件下sql更简单,因此号称效率更好。而静态sql的好处在于可以调试,可以代码提示。不管怎样,我发现我们的sql很多都是动态的。尤其是在sqlserver缺乏分页支持的sql2000,很多需要分页的存储过程都是这样的。动态sql的强大能力来自于字符串的拼接,因此,如何改善字符串拼接就是对代码可读性进行优化的关键。如果能够改成静态sql而不必牺牲性能就更好了。
1. 加号拼接
这是最常见的拼接,特点是好写,缺点是难读。很多时候容易写的代码往往不容易阅读——因为不需要为变量取名字,完全就是具体数值的思维就可以。而需要参数化的sql语句,需要的是稍微抽象的参数化的思维。不过参数化的思维也不难,毕竟我们从初一就开始学习参数化的数学了。
Sql = "select top 1 typeid,sonnum,deleted from ptype where (usercode='" + pFullName + "' or fullname='" + pFullName + "') and typeid ='" + ptypeid + "'";
代码表示更加usercode,fullname,typeid的条件,列出 ptype表的第一行。这里面的“+”的引入,导致整个sql在阅读角度看起来是支离破碎,难以一目了然的了解代码的意图。其中的涉及到sql字符串定界符的“’”的处理也让人觉得很伤心。
尽管以c#代码为例,但是在t-sql内利用“+”来拼接也不在少数,表现的问题也差不多一样。
2. format拼接
还是以同样的代码为案例,以格式化函数的方式来看:
Sql = "select top 1 typeid,sonnum,deleted from ptype where (usercode='{0}'' or fullname='{0}') and typeid ='{1}'";
Sql=string.format(sql,fullname,typeid);
尽管增加了一个函数,但是sql显然变得比较完整,sql本身不完整的信息,以参数的方式提出来,“'”带来的阅读干扰也不像“加号拼接”那么碍眼。当然问题也是存在的:首先因为参数采用数字,因此当sql大些,参数多些的时候,找到参数对应关系会变得很麻烦。其次,依然存在sql injection(sql注入)的问题。
3. AddParameter拼接
还是以同样的代码为案例,以格式化函数的方式来看:
Sql = "select top 1 typeid,sonnum,deleted from ptype where (usercode=@fullname or fullname=@fullname) and typeid =@typeid";
db.AddParameter("@fullname", fullname);
db.AddParameter("@typeid",typeid);
我个人认为,这个方式的拼接sql方法是最好的。不但sql可以完整的阅读,参数还是有名称的——这样即使参数很多,sql很长,对阅读的额外障碍也不多。也不存在sql injection问题。至于"'"也无需考虑了。 但是需要为变参想名字,这是写起来要麻烦的一个原因吧。
这三种sql拼接的风格,都是以c#为例的,但是对存储过程也是一样的效果。仅仅是换门语言而已。
侧写:我看过的克服“‘”阅读干扰的方法:
采用 CHAR(10)来替代"'"
SET @strSQL=@strSQL+' LEFT JOIN SCM_BillType t ON a.BillType = t.BillType '+CHAR(10)
SET @strSQL=@strSQL+' LEFT JOIN Pub_DType d ON a.DID = d._ID '+CHAR(10)
这段代码还表明,作者希望通过left join前面加入很多空格来对齐,一边可以print来查看最后的sql是什么。看来,这个sql的作者写代码的时候也是希望看到完整的sql的。
改善sql字符串的可读性 - sql字符串常见编写风格
2010年5月18日
10:31
分享到:
相关推荐
另一点是,在大多数情况下,查询的可读性和结构比使用字符串要好得多。 使用JSON DataType也更加容易(请参见下面的JSON-Example)。 支持SQL方言 默认情况下, json-sql-builder2支持以下语言。 MySQL 玛丽亚...
varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...
这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。 CursorType Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括...
sp_executesql 支持与 Transact-SQL 字符串分开的参数值的设置,如以下示例所示。 DECLARE @IntVariable int; DECLARE @SQLString nvarchar(500); DECLARE @ParmDefinition nvarchar(500); /* Build the SQL ...
该特性提高了您编码的生产力,改善了PL/SQL代码的可读性,促进了大规模工作团队的协作。 SQL 窗口 该窗口允许您输入任何SQL语句,并以栅格形式对结果进行观察和编辑,支持按范例查询模式,以便在某个结果集合中...
(1)关键字、注释块、引号内字符串、操作符、特殊字符等,用不同的彩色字体加以区别; (2)如果光标前面是一个括号,高亮度显示配对的括号 支持批量SQL语句的运行:用监控器监控每条语句的运行,在运行过程中可以...
(1)关键字、注释块、引号内字符串、操作符、特殊字符等,用不同的彩色字体加以区别 ; (2)如果光标前面是一个括号,高亮度显示配对的括号 支持批量SQL语句的运行:用监控器监控每条语句的运行,在运行过程中...
即使不是在运行时,也可以以编程方式构建查询,而不必将字符串放在一起。 在Clojars和cljdoc上构建最新版本:在代码上注解Honey SQL SQL作为Clojure数据结构。 即使不是在运行时,也可以以编程方式构建查询,而不必...
(1)关键字、注释块、引号内字符串、操作符、特殊字符等,用不同的彩色字体加以区别; (2)如果光标前面是一个括号,高亮度显示配对的括号 o 支持批量SQL语句的运行:用监控器监控每条语句的运行,在运行过程...
1 注释符注释是指程序代码中不执行的文本字符串,是对程序的说明,可以提高程序的可读性,使程序代码更易于维护,一般嵌入在程序中并以特殊的标记显示出来。在Transact-SQL中,注释可以包含在批处理、存储过程、...
支持多条SQL语句的成批运行,用控制台监控每条语句的运行, 在运行过程中可以中断/暂停/继续正在运行的 SQL,甚至可以更正出错误的 SQL,从而提高操作效率 <4> 支持彩色文本编辑,即关键字、注释块、引号内字符串、...
实践指南:充分利用PHP内置的字符串处理函数如trim(), strpos(), 数组处理函数如array_filter(), array_map(),以及日期和时间处理函数,减少重复造轮子。 代码优化 提高性能:减少冗余代码,对循环、查询等耗时...
即使不是在运行时,也可以以编程方式构建查询,而不必将字符串放在一起。 建造 Clojars和cljdoc上的最新版本: 该项目遵循版本方案MAJOR.MINOR.COMMITS,其中MAJOR和MINOR提供更改大小的一些相对指示,但不遵循...
2. 如果SQL中涉及变量 相比Statement的字符串拼接的方式,代码可读性提高,并且不容易出错。 3. 如果涉及批量执行多条SQL时 使用PreparedStatement执行效率较高 - 如果SQL中没有变量用Statement 有变量用...
影响代码的可维护性:SQL语句与C#混在一起,想修改SQL就得重新编译程序,而且二种代码混在一起,可读性也不好。 所以我通常会选择【参数化SQL】的方法去实现数据库的访问过程,而且会将SQL语句与项目代码(C#)分离...
该特性提高了您编码的生产力,改善了PL/SQL代码的可读性,促进了大规模工作团队的协作。 SQL 窗口——该窗口允许您输入任何SQL语句,并以栅格形式对结果进行观察和编辑,支持按范例查询模式,以便在某个结果集合中...
OQL.NET 是一套强类型的数据库对象查询语言 (OQL,Object Query Language),和 SQL 以及其它 OQL 不同的是,OQL.NET 基于宿主语言 (基于 C# 和 VB 等原生 .NET 语言而不是字符串)。OQL.NET 兼容 SQL-92 标准。 ...
但字符串常量区分大小写。建议命令大写,表名库名小写; <2> SQL语句可单行或多行书写,以";"结尾。关键词不能跨多行或简写。 <3> 用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。 ...
但字符串常量区分大小写。建议命令大写,表名库名小写; <2> SQL语句可单行或多行书写,以";"结尾。关键词不能跨多行或简写。 <3> 用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。 ...