警惕SQL语句陷井
以下SQL段,大家认为结果是什么呢?
DECLARE @A VARCHAR(50) SET @A='Zuowenjun.cn' SELECT TOP 1 @A=ISNULL(FIELDNAME,'DEFAULT') FROM TABLENAME WHERE 1=2 PRINT @A GO
可能大家都认为结果显示是:DEFAULT,因为变量@A初始化为:Zuowenjun.cn,在执行SQL查询后,由于条件1=2不成立,所以查询结果FIELDNAME的值应该是NULL,然后再执行ISNULL函数,就会将默认值DEFAULT赋给变量@A,然后最终打印是DEFAULT,但实际执行的结果却并不是这样,而是Zuowenjun.cn,原因是什么呢?经过我的分析,找到了问题的原因,那就是SELECT语句,在找不到的记录的情况下,是不会执行赋值操作的(即:ISNULL(FIELDNAME,'DEFAULT')根本没有执行),所以才会得出该结果,若要解决这个问题,我们可以使用SET关键字给变理赋值,如下改良过后SQL段:
DECLARE @A VARCHAR(50) SET @A='Zuowenjun.cn' SET @A=ISNULL((SELECT TOP 1 FIELDNAME FROM TABLENAME WHERE 1=2),'DEFAULT') PRINT @A GO
这样执行的结果就是DEFAULT,但这样存在局限性,因为SET只支持单个变量赋值,那同时给多个变量赋值则无法适用,所以如果需要给多个变量同时赋值的情况,我们可以采用如下方法,虽然有点复杂,但不影响执行效率:
DECLARE @A VARCHAR(50),@B VARCHAR(50)
SET @A='Zuowenjun.cn'
SET @B='XXXX'
SELECT @A=ISNULL(FIELDNAME1,'DEFAULT1'),@B=ISNULL(FIELDNAME2,'DEFAULT2')
FROM
(SELECT 1 AS F1) T1 left join
(SELECT TOP 1 FIELDNAME1,FIELDNAME2,1 AS F1
FROM TABLENAME WHERE 1=2) T2
on T1.F1=T2.F1 PRINT @A + '--' + @B
GO
说一下原理,因为(SELECT 1 AS F1)始终返回一条记录1,然后用这个表T1左连接我们要查询的SQL语句 T2,1 AS F1这个是必需的,因为关联需要用到,根据左连接的原则,左表不论右边是符合关联条件,都会返回记录,所以最外层的SELECT是一定有值,FIELDNAME1与FIELDNAME2这时都是NULL,执行ISNULL函数自然就得到了默认值。
当然以上情形是用在SQL查询语句可能存在不符合查询条件的情况,若确定能返回值,则没有必要这样做,或者即使存在不符合的情况,也可以通过后续逻辑判断来重新给变量赋值达到相同的效果,只是要写的语句就多些。
该篇文章为作者本人原创,文章内容仅表达个人意见或想法,仅供参考,若大家对此有不同的意见可参与评论,谢谢!
更多IT相关的文章,欢迎光临我的个人网站:http://www.zuowenjun.cn/
警惕SQL语句陷井的更多相关文章
- 省市县三级联动 sql语句
发现在网上的省市县三级联动大部分是mysql的.就算是sqlserver的,也不准确.于是就把mysql的给改了下,适用sqlserver.sql语句如下: CREATE TABLE Dic_Area ...
- 登录测试用例sql语句注入
利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...
- HIVE的sql语句操作
Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...
- 面试题: !=!=未看12 略多 sql语句练习 非常 有用
JAVA面试总结 2015年03月25日 16:53:40 阅读数:4306 刚才看到的,先转载过来,没准以后用到…… 面试总结 2013年8月6日: 问题2:Hibernate的核心接口有哪些? ...
- 【呕心总结】python如何与mysql实现交互及常用sql语句
9 月初,我对 python 爬虫 燃起兴趣,但爬取到的数据多通道实时同步读写用文件并不方便,于是开始用起mysql.这篇笔记,我将整理近一个月的实战中最常用到的 mysql 语句,同时也将涉及到如何 ...
- 面试题 | 数据库笔试题集合·之·SQL语句(2)
第2章 SQL 语句 2.1 选择2.1.1 DELETE FROM S WHERE 年龄>60 语句的功能是( A ) A.从 S 表中彻底删除年龄大于 60 岁的记录B.S 表中年龄大于 6 ...
- mysql学习之 sql语句的技巧及优化
一.sql中使用正则表达式 select name,email from user where email Regexp "@163[.,]com$"; sql语句中使用Regex ...
- 一条Sql语句分组排序并且限制显示的数据条数
如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ...
- LINQ to SQL语句(7)之Exists/In/Any/All/Contains
适用场景:用于判断集合中元素,进一步缩小范围. Any 说明:用于判断集合中是否有元素满足某一条件:不延迟.(若条件为空,则集合只要不为空就返回True,否则为False).有2种形式,分别为简单形式 ...
随机推荐
- android 开发 简单的页面布局
package com.example.test; import android.app.Activity; import android.os.Bundle; import android.view ...
- DNS劫持
忽然发现我最喜欢的chrome 一直有广告,好些论坛都有大量的广告,原以为是重了什么插件了,找了也没发现,有可能是DNS劫持. 打开路由器,找到 dns 设置里面把里面的全部去掉.然后把 192.16 ...
- StarUml:Exception EOleSysError in module StarUML.ex
http://sourceforge.net/p/staruml/discussion/510442/thread/9fe12cac/ run as administrator.Works fine.
- Simple-RTMP-Server 服务器搭建
Simple-RTMP-Server 服务器搭建 1. 服务器镜像获取 github源码地址 git clone https://github.com/winlinvip/simple-rtmp-se ...
- 解决adb shell input text 中文输入,unicode转utf-8
https://github.com/senzhk/ADBKeyBoard 上面这个是外国人写的一个输入法,我们把它安装再设置下就ok了 直接下载bin下的ADBKeyBoard.apk文件,或者上面 ...
- ARM中C和汇编混合编程及示例(转)
在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...
- 将json转换成struts参数
加入对象为{name:'tom','class':{className:'class1'},classMates:[{name:'lily'}]}struts2期待的格式是 name=tom& ...
- Storage Systems topics and related papers
In this post, I will distill my own ideas and my own views into a structure for a storage system cou ...
- 海蜘蛛WiFiDog固件 MTK7620 OEM,带云AC功能、探针、广告插入,MTK7620解包打包维修默认参数
修改内容: 1.系统默认管理员员帐号密码 2.系统默认LAN 接口地址 3.系统默认DHCP及保留地址 4.系统默认云AC远程地址及协议内容 5.系统默认JS插入地址 6.系统默认探针位置 7.默认顶 ...
- android google 统计导致的文件冲突
android studio 加入google 统计 1. buildscript { repositories { jcenter() } dependencies { classpath 'com ...