`
1000copy
  • 浏览: 72521 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

改善sql字符串的可读性 - sql字符串常见编写风格

阅读更多

 

所谓的动态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 + "'";

 

代码表示更加usercodefullnametypeid的条件,列出 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 injectionsql注入)的问题。

 

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字符串常见编写风格

2010518

10:31

 

0
0
分享到:
评论

相关推荐

    json-sql-builder2:升级您SQL查询

    另一点是,在大多数情况下,查询的可读性和结构比使用字符串要好得多。 使用JSON DataType也更加容易(请参见下面的JSON-Example)。 支持SQL方言 默认情况下, json-sql-builder2支持以下语言。 MySQL 玛丽亚...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...

    SQL语法大全

    这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。 CursorType Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括...

    SQL示例大全.pdf

    sp_executesql 支持与 Transact-SQL 字符串分开的参数值的设置,如以下示例所示。 DECLARE @IntVariable int; DECLARE @SQLString nvarchar(500); DECLARE @ParmDefinition nvarchar(500); /* Build the SQL ...

    PL/SQL Developer8.04官网程序_keygen_汉化

    该特性提高了您编码的生产力,改善了PL/SQL代码的可读性,促进了大规模工作团队的协作。 SQL 窗口  该窗口允许您输入任何SQL语句,并以栅格形式对结果进行观察和编辑,支持按范例查询模式,以便在某个结果集合中...

    震撼推出超方便实用的Oracle开发工具 - Oracle SQL Handler,双语界面,智能SQL编辑器,免装Oracle客户端,能运行于Windows, 双语界面

    (1)关键字、注释块、引号内字符串、操作符、特殊字符等,用不同的彩色字体加以区别; (2)如果光标前面是一个括号,高亮度显示配对的括号 支持批量SQL语句的运行:用监控器监控每条语句的运行,在运行过程中可以...

    Oracle开发工具 - Oracle SQL Handler(功能强大,超方便好用, 免装客户端, Windows / Linux)

    (1)关键字、注释块、引号内字符串、操作符、特殊字符等,用不同的彩色字体加以区别 ; (2)如果光标前面是一个括号,高亮度显示配对的括号 支持批量SQL语句的运行:用监控器监控每条语句的运行,在运行过程中...

    将Clojure数据结构转换为SQL-Python开发

    即使不是在运行时,也可以以编程方式构建查询,而不必将字符串放在一起。 在Clojars和cljdoc上构建最新版本:在代码上注解Honey SQL SQL作为Clojure数据结构。 即使不是在运行时,也可以以编程方式构建查询,而不必...

    一个oracle客户端(oracle sql handler)

    (1)关键字、注释块、引号内字符串、操作符、特殊字符等,用不同的彩色字体加以区别; (2)如果光标前面是一个括号,高亮度显示配对的括号 o 支持批量SQL语句的运行:用监控器监控每条语句的运行,在运行过程...

    SQL Server的基本功能性语句介绍

    1 注释符注释是指程序代码中不执行的文本字符串,是对程序的说明,可以提高程序的可读性,使程序代码更易于维护,一般嵌入在程序中并以特殊的标记显示出来。在Transact-SQL中,注释可以包含在批处理、存储过程、...

    Oracle SQL Handler (Oracle客户端工具) V3.1

    支持多条SQL语句的成批运行,用控制台监控每条语句的运行, 在运行过程中可以中断/暂停/继续正在运行的 SQL,甚至可以更正出错误的 SQL,从而提高操作效率 <4> 支持彩色文本编辑,即关键字、注释块、引号内字符串、...

    PHP语言开发常见问题解决办法入门总结.docx

    实践指南:充分利用PHP内置的字符串处理函数如trim(), strpos(), 数组处理函数如array_filter(), array_map(),以及日期和时间处理函数,减少重复造轮子。 代码优化 提高性能:减少冗余代码,对循环、查询等耗时...

    honeysql:将Clojure数据结构转换为SQL

    即使不是在运行时,也可以以编程方式构建查询,而不必将字符串放在一起。 建造 Clojars和cljdoc上的最新版本: 该项目遵循版本方案MAJOR.MINOR.COMMITS,其中MAJOR和MINOR提供更改大小的一些相对指示,但不遵循...

    MySQL数据库

    2. 如果SQL中涉及变量 相比Statement的字符串拼接的方式,代码可读性提高,并且不容易出错。 3. 如果涉及批量执行多条SQL时 使用PreparedStatement执行效率较高 - 如果SQL中没有变量用Statement 有变量用...

    CPQuery 解决拼接SQL的新方法

    影响代码的可维护性:SQL语句与C#混在一起,想修改SQL就得重新编译程序,而且二种代码混在一起,可读性也不好。 所以我通常会选择【参数化SQL】的方法去实现数据库的访问过程,而且会将SQL语句与项目代码(C#)分离...

    PLSQLDeveloper下载

    该特性提高了您编码的生产力,改善了PL/SQL代码的可读性,促进了大规模工作团队的协作。 SQL 窗口——该窗口允许您输入任何SQL语句,并以栅格形式对结果进行观察和编辑,支持按范例查询模式,以便在某个结果集合中...

    Macrobject OQL.NET 对象查询语言

    OQL.NET 是一套强类型的数据库对象查询语言 (OQL,Object Query Language),和 SQL 以及其它 OQL 不同的是,OQL.NET 基于宿主语言 (基于 C# 和 VB 等原生 .NET 语言而不是字符串)。OQL.NET 兼容 SQL-92 标准。  ...

    数据库.txt

    但字符串常量区分大小写。建议命令大写,表名库名小写; <2> SQL语句可单行或多行书写,以";"结尾。关键词不能跨多行或简写。 <3> 用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。 ...

    第一章数据库的简介.docx

    但字符串常量区分大小写。建议命令大写,表名库名小写; <2> SQL语句可单行或多行书写,以";"结尾。关键词不能跨多行或简写。 <3> 用空格和缩进来提高语句的可读性。子句通常位于独立行,便于编辑,提高可读性。 ...

Global site tag (gtag.js) - Google Analytics