所谓的动态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
分享到:
相关推荐
在Qt框架中,字符串处理是常见的任务之一,而格式化字符串是其中的关键部分。这篇博客主要探讨了Qt中三种不同的字符串格式化方法:QString::arg()、QString::sprintf()和QStringList::join(),并进行了性能比较。...
在实际应用中,SQL字符串的格式化不仅关乎美观,更是直接影响到代码的可读性和维护性。尤其是在大型项目中,一致的代码风格对于团队协作至关重要。因此,理解并掌握如何使用这样的工具,是每个IT专业人员提升专业...
这个工具通过将查询条件组织成一个JavaScript对象,然后将其转换为有效的SQL字符串,从而避免了手动编写复杂的SQL语句时可能出现的错误。在JavaScript开发中,尤其是在处理动态数据或需要频繁构建SQL查询的情况下,...
在ASP.NET开发过程中,编写SQL字符串是一项基本但又容易出错的任务。尤其是对于初学者来说,正确处理字符串中的双引号、单引号以及连接运算符&常常会成为一个挑战。本文将详细介绍这些元素的使用规则,并提供一个...
本文将围绕“取字符串中字符位置”这一主题展开,深入探讨在SQL Server 2000及后续版本如SQL Server 2005中,如何有效地获取字符串中某一字符的位置,以及基于此进行更复杂的数据处理。 ### SQL Server中的字符串...
以下是一些常见的SQL字符串函数及其用途: 1. **CONCAT()**:这个函数用于连接两个或多个字符串。例如,`CONCAT('Hello', ' ', 'World')` 将返回 "Hello World"。 2. **SUBSTRING()**:它允许你从一个字符串中提取...
在SQL Server中,字符串处理是常见的任务之一,而字符串切割函数则是处理字符串的重要工具。本文将深入探讨SQL Server中的字符串切割函数,特别是如何创建和使用用户定义函数来实现这一功能。 首先,我们要明白用户...
总之,"Sql Server脚本转Delphi语言格式字符串工具"是一个实用的开发辅助工具,它解决了数据库脚本与编程语言字符串格式之间的转换问题,节省了开发者的时间,提高了代码的可读性和维护性。对于熟悉Sql Server和...
在SQL Server 2012中,引入了一个新的字符串函数——CONCAT,它的主要功能是方便地连接多个字符串。在CONCAT函数出现之前,我们通常使用 "+" 运算符来连接字符串,但这种方法存在一个问题,即如果其中任何一个字符串...
在IT领域,尤其是在编程与数据处理中,统计字符串中特定字符的出现次数是一个常见的需求。本文将深入探讨几种实现这一功能的方法,并通过实际代码示例和性能对比分析,帮助读者理解每种方法的优劣,以便在实际开发中...
在处理SQL时,动态SQL功能是MyBatis的一大亮点,它有效地解决了SQL字符串拼接的问题,避免了手动拼接带来的错误和复杂性。 1. **If标签**:MyBatis的`<if>`标签用于条件判断,它允许我们在SQL语句中根据Java对象的...
在SQL语言中,存储过程是一种预编译的SQL语句集合...在编写存储过程时,根据所使用的数据库系统选择适当的方法进行字符串拼接是非常重要的。理解这些功能可以帮助我们更有效地构造动态SQL,提高代码的可读性和维护性。
理解字符串操作的底层原理,如字符串缓冲区、原地算法等,可以帮助我们编写更高效的代码。 8. 安全性 在处理用户输入时,字符串安全不容忽视。SQL注入、XSS攻击等都与字符串处理有关。了解如何转义特殊字符,避免...
在PHP编程中,字符串处理是常见的任务之一,无论是数据输入、输出还是存储,都需要对字符串进行各种操作。本文将深入探讨PHP中的一些基本字符串处理技巧,包括转换、过滤、解析、查找、截取、替换、获取、判断和计算...
标题中的"T-SQL功能:在所有字符之间添加空格"是指一种使用Transact-SQL(T-SQL),SQL Server的扩展语法,来处理字符串的方法。这个功能允许你在字符串的每个字符间插入一个空格,从而扩展字符串。这在处理文本数据...
首先,定义了一个字符串变量`m_sConn`来存储连接字符串,其中包含了Provider、Password、PersistSecurityInfo、UserID和DataSource等关键参数。接下来,通过实例化ADODB.Connection对象并调用其`Open`方法,实现了与...
日期转化为字符串的转换过程是关键步骤,因为这直接影响到数据的可读性与兼容性。本文将全面探讨Asp.net中日期转字符串的各种方法和应用场景。 1. **DateTime.ToString()** `DateTime.ToString()` 方法是最基础的...
- `NULL` 不等于任何数字或空字符串。 - 包含 `NULL` 的算术表达式的结果也是 `NULL`。 ```sql SELECT pub_id, pub_name, city, state FROM publishers; ``` #### 十三、定义列别名 - 列别名可以用来更改查询...
你可以使用简单的类型(如字符串、整数)或复杂的Java对象进行映射。 5. **事务管理**:iBATIS支持编程式和声明式的事务管理。在SqlMapConfig.xml中,你可以配置事务的隔离级别、回滚规则等。 6. **缓存机制**:...
通过分析这个类,我们可以学习如何在Java中处理SQL字符串,理解其内部的字符串操作、正则表达式和逻辑判断等技术。此外,这也可以作为一个起点,为那些希望扩展或定制SQL格式化功能的开发者提供参考。 总的来说,这...