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中的一些小陷阱的更多相关文章

  1. C# 中几个小“陷阱”

    每天写代码,偶尔就会有让你抓狂的时候:代码改了千百遍,蓦然回首,Bug就在灯火阑珊处……这里就列举一些容易犯错的几个小地方,以后遇到了其他的,再慢慢添加.   1. 获取程序当前运行路径   情景复现 ...

  2. java常量池中基本数据类型包装类的小陷阱

    想必大部分学过java的人都应该做过这种题目: public class Test { public static void main(String[] args) { //第一个字符串 String ...

  3. C++ string中的几个小陷阱,你掉进过吗?

    C++开发的项目难免会用到STL的string,使用管理都比char数组(指针)方便的多,但在得心应手的使用过程中也要警惕几个小陷阱,避免我们项目出bug却迟迟找不到原因. 1.  结构体中的stri ...

  4. Unity 3D中C#的性能优化小陷阱

    本篇内容主要来自Unity官方手册: 一般性能优化 一些地方为本人瞎编杜撰,请酌情参考.如有错误,欢迎指出. Unity里C#编程虽然既简单还很爽,但是性能小陷阱还不少.我总强迫自己让代码最优,因此很 ...

  5. ESXi与物理交换机静态链路聚合配置过程中的小陷阱

    作者:陆斌文章来自微信公众号:平台人生 内容简介:ESXi与物理交换机之间配置静态链路聚合时,因为静态链路聚合的特点,在进行down网卡和从虚拟交换机移除网卡的操作时,可能会无法完成故障流量切换,影响 ...

  6. 那些年我们踩过的坑,SQL 中的空值陷阱!

    文章目录 NULL 即是空 三值逻辑 空值比较 NOT IN 与空值 函数与空值 DISTINCT.GROUP BY.UNION 与空值 ORDER BY 与空值 空值处理函数 字段约束与空值 SQL ...

  7. 正则表达式小技巧,sql中in的字符串处理

    工作中我经常写sql,当写带in的语句时,需要敲好多单引号,逗号,敲写起来容易易出错.因此,我写了一个小工具,处理这种繁琐工作.原理简单,利用正则表达式匹配.替换. 先看界面,一个html页面,包含三 ...

  8. Python中定义函数时参数有默认值的小陷阱

    在定义函数的时候,如果函数的参数有默认值,有两种类型的参数,一种是整数,字符串这种不可变类型,另一种是列表这种可变类型,对于第一种情况没有什么特殊的地方,但是对于可变类型,有一个微妙的小陷阱. 可变类 ...

  9. sql 中set和select区别

    基于SQL中SET与SELECT赋值的区别详解 2012年09月06日 ⁄ 综合 ⁄ 共 912字 ⁄ 字号 小 中 大 ⁄ 评论关闭 最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET ...

随机推荐

  1. velocity导出word报错解决

  2. Replication的犄角旮旯(五)--关于复制identity列

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  3. 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发

    概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...

  4. 高性能网站架构设计之缓存篇(1)- Redis的安装与使用

    一.什么 Redis REmote DIctionary Server,简称 Redis,是一个类似于Memcached的Key-Value存储系统.相比Memcached,它支持更丰富的数据结构,包 ...

  5. node(redis)

    给出node下redis操作的简单例子: var redis = require("redis"), client = redis.createClient(6379,'127.0 ...

  6. 从3D Touch 看 原生快速开发

    全新的按压方式苹果继续为我们带来革命性的交互:Peek和Pop,Peek 和 Pop 让你能够预览所有类型的内容,甚至可对内容进行操作,却不必真的打开它们.例如,轻按屏幕,可用 Peek 预览收件箱中 ...

  7. DOM+CSS3实现小游戏SwingCopters

    前些日子看到了一则新闻,flappybird原作者将携新游戏SwingCopters来袭,准备再靠这款姊妹篇游戏引爆大众眼球.就是下面这个小游戏: 前者的传奇故事大家都有耳闻,至于这第二个游戏能否更加 ...

  8. Linux tr命令

    介绍 tr命令可以对来自标准输入的字符进行替换.压缩和删除.tr只能接收来自标准的输入流,不能接收参数. 语法 tr [OPTION]... SET1 [SET2] 注意:SET2是可选项 OPTIO ...

  9. 本地DNS安装

    在centOS里最常用的DNS服务工具应该是bind了.下面就以bind为例做一个DNS服务. 首先查看bind 是否已经安装 Rpm -qa | gerp bind 如果没有的话就用yum 安装一下 ...

  10. HTML学习入门

    HTML(元素.属性) HTML: 超文本标记语言   1. 超文本即为带有链接属性的文本  2.标记即为标签 一.body属性: bgcolor:页面背景颜色 text:文字颜色 backgroun ...