T-SQL中的一些小陷阱
1,当心ISNULL函数对你的逻辑引起BUG
有人喜欢或者习惯于(并不代表我推荐,甚至这种写法没有任何好处)用ISNULL处理变量这种方式写查询
比如:select * from TestISNULL where name = ISNULL(@name,name)
@name相当于传入到存储过程中的参数,如果@name为null,
相当于:select * from TestISNULL where name = name,看起来恒成立,是真的吗?
目的是在@name为null的时候,这个查询条件不生效
当时当遇到字段name中的某些数据为null的时候,实际逻辑就变成了
select * from TestISNULL where null= null,null=null是什么结果?
自己试试或者继续往下看就知道了,
此时会产生一些“莫名其妙”的bug,这种bug是跟数据有关,有时候出现,而有时候又没有问题,
对于“有时候出现有时候不出现的问题”,不管是SQL还是应用程序代码,定位起来都不是太容易的
这种情况,会对对问题的排查产生了很大的干扰
看例子:
--ISNULL 处理变量的一个小陷阱
Create Table TestISNULL
(
id int,
name )
)
GO
,'AAA')
,'BBB')
GO
)
set @name=null
select * from TestISNULL where name = ISNULL(@name,name)
--结果是两行没有任何问题
/*
id name
----------- ----------------------
1 AAA
2 BBB
(2 row(s) affected)
*/
--插入一条数据
,null)
GO
select * from TestISNULL
--全部结果是三行
/*
id name
----------- --------------------
1 AAA
2 BBB
3 NULL
(3 row(s) affected)
*/
--继续用isnull的方式处理变量做查询
)
set @name=null
select * from TestISNULL where name = ISNULL(@name,name)
--结果是两行,你明白为什么吗
/*
id name
----------- ----------------------
1 AAA
2 BBB
(2 row(s) affected)
究竟为什么呢?好吧,下面应该很清楚了

2,SQL Server 对数据类型优先级引起Case When 的一些语法错误
继续用上面的表验证另外一个小语法问题,某些逻辑处理数据的时候,字段为null的时候,将结果统一标记为一种数值,如下
当然,这样是通不过的,提示将AAA转换为数值的时候失败
这种问题本质上是:会将低优先级的varchar转换为高优先级的int进行对比
但是在将字符转换为数值型的时候,就会出现转换失败的情况
这里就涉及到SQL Server数据类型优先级的问题,有兴趣的自行MSDN
SELECT id,
CASE
ELSE name
END AS name
FROM TestISNULL
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'AAA' to data type int.
解决办法就是统一数据类型,注意字符0和数值0是不一样的,这样就不会引起数据类型优先级转换的问题
SELECT id,
CASE
'
ELSE name
END AS name
FROM TestISNULL
当然这个问题的“变种”不仅限于case when,有各种各样的“变种”,
当遇到“Error converting data type *** to ***.”此类问题的时候,可以考虑是不是这个原因引起的,对快速定位问题可以起到帮助作用,避免在这些小逻辑上浪费太多时间。
T-SQL中的一些小陷阱的更多相关文章
- C# 中几个小“陷阱”
每天写代码,偶尔就会有让你抓狂的时候:代码改了千百遍,蓦然回首,Bug就在灯火阑珊处……这里就列举一些容易犯错的几个小地方,以后遇到了其他的,再慢慢添加. 1. 获取程序当前运行路径 情景复现 ...
- java常量池中基本数据类型包装类的小陷阱
想必大部分学过java的人都应该做过这种题目: public class Test { public static void main(String[] args) { //第一个字符串 String ...
- C++ string中的几个小陷阱,你掉进过吗?
C++开发的项目难免会用到STL的string,使用管理都比char数组(指针)方便的多,但在得心应手的使用过程中也要警惕几个小陷阱,避免我们项目出bug却迟迟找不到原因. 1. 结构体中的stri ...
- Unity 3D中C#的性能优化小陷阱
本篇内容主要来自Unity官方手册: 一般性能优化 一些地方为本人瞎编杜撰,请酌情参考.如有错误,欢迎指出. Unity里C#编程虽然既简单还很爽,但是性能小陷阱还不少.我总强迫自己让代码最优,因此很 ...
- ESXi与物理交换机静态链路聚合配置过程中的小陷阱
作者:陆斌文章来自微信公众号:平台人生 内容简介:ESXi与物理交换机之间配置静态链路聚合时,因为静态链路聚合的特点,在进行down网卡和从虚拟交换机移除网卡的操作时,可能会无法完成故障流量切换,影响 ...
- 那些年我们踩过的坑,SQL 中的空值陷阱!
文章目录 NULL 即是空 三值逻辑 空值比较 NOT IN 与空值 函数与空值 DISTINCT.GROUP BY.UNION 与空值 ORDER BY 与空值 空值处理函数 字段约束与空值 SQL ...
- 正则表达式小技巧,sql中in的字符串处理
工作中我经常写sql,当写带in的语句时,需要敲好多单引号,逗号,敲写起来容易易出错.因此,我写了一个小工具,处理这种繁琐工作.原理简单,利用正则表达式匹配.替换. 先看界面,一个html页面,包含三 ...
- Python中定义函数时参数有默认值的小陷阱
在定义函数的时候,如果函数的参数有默认值,有两种类型的参数,一种是整数,字符串这种不可变类型,另一种是列表这种可变类型,对于第一种情况没有什么特殊的地方,但是对于可变类型,有一个微妙的小陷阱. 可变类 ...
- sql 中set和select区别
基于SQL中SET与SELECT赋值的区别详解 2012年09月06日 ⁄ 综合 ⁄ 共 912字 ⁄ 字号 小 中 大 ⁄ 评论关闭 最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET ...
随机推荐
- spring MVC原理
spring MVC原理 Spring MVC工作流程图 图一 图二 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt D ...
- Oracle Created Database Users: Password, Usage and Files References (文档 ID 160861.1)
This document is no longer actively maintained, for info on specific (new) users in recent product e ...
- 【转】Eclipse打JAR包,插件FatJar安装与使用
原文地址:http://blog.csdn.net/jikeyzhang/article/details/4731968 下载RUL: 下载fatJar插件,解压缩后是一个.../plugins/(n ...
- 如何快速把hdfs数据动态导入到hive表
1. hdfs 文件 {"retCode":1,"retMsg":"Success","data":[{" ...
- nginx(4、缓存)
nginx提供内置的缓存功能,对静态文件,如html\css\js等能够缓存在本地,即nginx服务器的某个目录下. 其配置主要是两部分: 1.在http下配置一个缓存路径: proxy_cache_ ...
- Jquery Mobile 小结
第一次做一个移动站点,当时纠结选Jquery Mobile还是Zepto,Zepto相对于JM更加轻巧,语法上面也很相似,但考虑到时间问题和JM自带了很多组件(Bootstrap惯出来的),还是选择了 ...
- Linux date命令
命令概述 date命令可以用来设置和显示系统当前时间,特别是在有一些Shell命令里面用到date命令来做日期的不同的显示,所以该命令也是非常需要掌握的一个命令. 语法 date [OPTION].. ...
- [nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)
:由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作.为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) . ...
- 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- [译+改]最长回文子串(Longest Palindromic Substring) Part II
[译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...