高性能安全式SQL拼接

不少开发人员在进行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注入问题

    三、一次编译通过无需再次编译

    四、利用了索引功能(提升性能)

    五、防止了特殊符号的影响

时间: 2024-11-09 10:30:30

高性能安全式SQL拼接的相关文章

Calcite中的流式SQL

Calcite中的流式SQL Calcite中的流式SQL总体设计思路 总体语法应该兼容SQL,这个是和目前流处理SQL的发展趋势是一致的. 如果部分功能标准SQL中没有包含,则尽量采用业界标杆(Oracle).比如模式匹配的功能,目前流处理中还没有针对语法达成共识,那么在设计上,就采用Oracle data warehouse的Match Recognize的方式.还有滑窗功能. 如果还有功能目前业界标杆都没有,那么就通过函数的方式拓展,翻滚窗口和跳动窗口,这两个窗口在标准SQL中都是不包含的

4.mybatis动态SQL拼接/取值/OGNL

4.mybatis动态SQL拼接/取值 一.mybatis框架的SQL拼接是采用OGNL表达式进行的,以下我会列出常用的取值方法. 图片来源:慕课网 1.1常用的取值方法: 1.2特殊的取值方法: mod为取余数

SQL 拼接字符串(字符串中有变量) 转载的

http://blog.csdn.net/sikaiyuan2008/article/details/7848926 sql server数据库存储sql SQL SERVER拼接字符串(字符串中有变量)  总是忘记规律,转载过来以帮助记忆. 一.拼接字符串(整个字符串不分割)步骤: 首先在字符串的前后加单引号: 字符串中的变量以'''[email protected]+'''在字符串中表示: 若在执行时存在类型转换错误,则应用相应的类型转换函数,对变量进行类型转换(如cast()函数). 示例

多条件搜索问题 -sql拼接与参数化查询

来源:传智播客  免费开发视频. 问题:根据书名或出版社或作者查询书籍信息. using System; using System.Collections.Generic问题; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClie

SQL拼接小技巧(一)

# SQL拼接小技巧(一) # 2018/6/21 18:54:36 ---------- **关键字:  SQL , 1 = 1 ,1 = 2** ---------- 如下代码中SQL拼接使用了1=1和1=2防止请求参数中条件为空或SQL注入的方式猜测表名,字段名 public DomainPage<RealNameVerifyInfo> getVerifyList(String vin, String name, String phoneNum, String status, Strin

Mybatis的动态sql拼接语句

Mybatis的动态sql拼接语句 1.主配置文件SqlMapConfig.xml  <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE configuration         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"         "http://mybatis.org/dtd/mybatis-3-config.dtd

Parquet与ORC:高性能列式存储格式(收藏)

背景 随着大数据时代的到来,越来越多的数据流向了Hadoop生态圈,同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要,在Hadoop生态圈的快速发展过程中,涌现了一批开源的数据分析引擎,例如Hive.Spark SQL.Impala.Presto等,同时也产生了多个高性能的列式存储格式,例如RCFile.ORC.Parquet等,本文主要从实现的角度上对比分析ORC和Parquet两种典型的列存格式,并对它们做了相应的对比测试. 列式存储 由于OLAP查

Parquet与ORC:高性能列式存储格式

背景 随着大数据时代的到来,越来越多的数据流向了Hadoop生态圈,同时对于能够快速的从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要,在Hadoop生态圈的快速发展过程中,涌现了一批开源的数据分析引擎,例如Hive.Spark SQL.Impala.Presto等,同时也产生了多个高性能的列式存储格式,例如RCFile.ORC.Parquet等,本文主要从实现的角度上对比分析ORC和Parquet两种典型的列存格式,并对它们做了相应的对比测试. 列式存储 由于OLAP查

SQL 拼接多个字段的值&amp;一个字段多条记录的拼接

如student表: studentID studentName studentScore 01 Alice 90 02 Bill 95 03 Cindy 100 一.拼接多个字段的值 select studentID+‘-’+studentName+'-'+studentScore AS studentInfo from student 结果: 二.一个字段多条记录的拼接 select stuff((select '|'+studentName from student for xml pat