SQL server 中,如果查询或筛选的条件中,某字段的值为NULL,如何处理?又有哪些坑需要避免呢? 直接上坑 : NULL 与其他任何类型进行逻辑判断: [解释]: NULL表示值未知,和空字符(空白)和0 不一样: NULL和NULL或其他任何值做逻辑判断的时候,返回的值都是UNKNOWN: NULL 在in 或 not in 语句中,比如where classNum in (null,1), 或 where classNum not in (1,2),where classNum no…
sql server中NULL导入decimal字段时报错 在导入CSV文件时,如果decimal字段为null值,导致文本文件入库时失败. 错误现象 构造例子 新建一张表,包含decimal字段. create table dbo.test (id smallint, subtotal decimal(20,3)) select * from dbo.test 新建一个文本文件,将部分subtotal字段值设置为NULL id,subtotal 1,20.3 2,10.3 3,5.3 4,NU…
简介      在SQL Server中,针对复杂查询使用TOP子句可能会出现对性能的影响,这种影响可能是好的影响,也可能是坏的影响,针对不同的情况有不同的可能性.      关系数据库中SQL语句只是一个抽象的概念,不包含任何实现.很多元数据都会影响执行计划的生成,SQL语句本身并不作为生成执行计划所参考的元数据(提示除外),但TOP关键字却是直接影响执行计划的一个关键字,因此在某些情况下使用TOP会导致性能受到影响,下面我们来看集中不同的情况.   单表情况     对于单表查询(这里的所说…
SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致执行计划从索引查找(Index Seek)变为索引扫描(Index Scan) Implicit Conversion will cause index scan instead of index seek. While implicit conversions occur in SQL Serve…
DECLARE @a int declare @b int IF(@a<>@b) print('@a<>@b') else print('@a=@b') ) print('b<>1') else print('b=1') 如上代码 在SQL Server中的执行结果是:  @a=@b  b=1 解释: @b没有赋值,默认值为NUll,NUll的意思是不知道,拿一个不知道的变量来做比较 永远会返回false. 以上的代码无论拿变量@b和@a怎么逻辑运算 都不会去执行if中…
我们都知道SQL Server中NULL是一个很特殊的存在,因为NULL不会等于任何值,且NULL也不会不等于任何值.对于NULL我们只能使用IS或IS NOT关键字来进行比较. 我们先来看看下面一个SQL查询,由于NULL不会等于任何值,所以毫无疑问下面的查询会返回0: END 输出结果: 那么如果我们在上面查询的基础上,给判断条件NULL=1前加上NOT关键字效果如何呢?如下所示: END 输出结果: 我们可以看到输出还是0,有些同学可能会觉得很奇怪,判断条件NULL=1不是返回False吗…
其实本来这个问题没有什么好说的,今天优化的时候遇到一个SQL语句,因为比较有意思,所以我截取.简化了SQL语句,演示给大家看,如下所示 declare @bamboo_Code varchar(3);   set @bamboo_Code='-01';     SELECT DISTINCT yarn_lot FROM   dbo.rsjob WITH ( nolock ) WHERE  RIGHT(ges_no, 3) = @bamboo_Code        AND Isnull(yarn…
在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index Scan))呢?是否所有情况都是如此?又该如何优化呢? 下面我们通过一些简单的例子来分析理解这些现象.下面的实验环境为SQL SERVER 2008,如果在不同版本有所区别,欢迎指正.   堆表单索引 首先我们构建我们测试需要实验环境,具体情况如下所示: DROP TABLE TEST    CRE…
parameter sniff问题是重用其他参数生成的执行计划,导致当前参数采用该执行计划非最优化的现象.想必熟悉数据的同学都应该知道,产生parameter sniff最典型的问题就是使用了参数化的SQL(或者存储过程中使用了参数化)写法,如果存在数据分布不均匀的情况下,正常情况下生成的执行计划,在传入在分布数据较多的参数的情况下,重用了正常参数生成的执行计划,而这种缓存的执行计划并非适合当前参数的一种情况. 这种情况,在实际业务中,出现的频率还是比较高的,因为存储过程一般都是采用参数化的写法…
对表进行插入操作,如datetime和int类型的两个字段,都允许为null,用“sqlcmd.Parameters.Add("@t12",tb12.Text)”参数绑定时.datetime类型时,tb12.Text为空,插入成功,不报错,查看该值,却为1900-01-01:int类型时,用同样语句,tb12.Text为空,插入成功,不报错,查看该值,却为0:用“sqlcmd.Parameters.Add(new SqlParameter("@t12",SqlDbT…