不少开发人员在进行SQL拼接时头痛之极,不知道如何进行拼接操作才会更安全又不影响性能,下面我以存储过程为例与大家分享一个相对比较安全高效的方法
简介:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
格式:
CREATE PROCEDURE [拥有者.]存储过程名
[(参数#1,…参数#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行
其中存储过程名不能超过128个字。每个存储过程中最多设定1024个参数
(SQL Server 7.0以上版本),参数的使用方法如下:
@参数名数据类型[VARYING] [=内定值] [OUTPUT]
案例:
需求:1、查询一张图片表中前10笔图片信息
条件:1、按图片类型(imgtype)添加人员编号(agentID)
2、若图片类型参数为空(NULL)查询所有类型
3、若添加人员参数为空(NULL)查询所有人员
下面我们来分析一下我们经常使用的两种不同写法 会带来什么样的结果有什么样的不足之处
写法一:(不推荐)
优势:一、阅读或写法简单符合面向过程思路,大多数程序员都喜欢
不足:一、无法防止SQL注入问题;(防SQL注入核心方法:参数化)
二、影响性能(这种写法参数无法确定导致每次调用时都会重新编译)
三、无法避免特殊符号的影响
写法二:(不推荐)
优势:1、代码量少,阅读简单
2、防止了SQL注入问题
不足:1、隐藏了一个定时炸弹(非常可怕的东西)
1.1、当资料和参数为NULL时 查询条件变成了 NULL=NULL,NULL=NULL真的成立吗?
现在大家应该明白原因了吧,此方法容易导致数据丢失(目前查询中的资料显示 NULL=NULL成立与否跟SQL服务器配置有关,对于这种时对时错的方式最好不用,否则找问题你会后悔死的)
2、大数据下此写法性能非常低(丢失了索引键)
2.1、使用存储过程原因(1、提高性能,2、安全,3、逻辑业务.....)大数据下提高查询性能(除硬件,架构..之外),建立索引是非常重要的但是写法不同
会导致索引建丢失 分析一下:
反而这种写法性能更高
写法三:(推荐)
优势:一、阅读或写法简单符合面向过程思路,大多数程序员都喜欢
二、参数化解决SQL注入问题
三、一次编译通过无需再次编译
四、利用了索引功能(提升性能)
五、防止了特殊符号的影响