精华内容
下载资源
问答
  • 本篇文章是对SQLServer中ISNULLNULLIF的使用进行了详细分析介绍,需要的朋友参考下
  • SQL Server里的 ISNULL 与 ASP 中的 IsNull不同,SQL Server 中有两个参数,语法: ISNULL(check_expression, replacement_value) check_expression 与 replacement_value 数据类型必须一致如果 check_...

     

    SQL Server里的 ISNULL 与 ASP 中的 IsNull不同,SQL Server 中有两个参数,语法:

    ISNULL(check_expression, replacement_value)

    • check_expression 与 replacement_value 数据类型必须一致
    • 如果 check_expression 为 NULL,则返回 replacement_value
    • 如果 check_expression 不为 NULL,则返回 check_expression

     

    NULLIF 用于检查两个表达式,语法:

    NULLIF(expression, expression)

    • 如果两个 expression 相等,则返回 NULL,该 NULL 为第一个 expression 的数据类型
    • 如果两个 expression 不相等,则返回第一个 expression

     

     

    isnull() (效率)是有影响的,因为不能被优化。
    但是 is null 则不一定了,也许能被优化,看你的SQL和索引的情况。
    总之就是尽量避免使用 isnull(),或者,尽量在最小的结果集上用这个函数。

     

    展开全文
  • SQL Server 的某些表字段默认是NULL,对于NULL字段如何处理?
  • SQL Server NULL的正确用法

    千次阅读 2018-11-29 21:12:22
    =null,要使用SQL专用判断 字段 is not null 2.在程序中取SQL查询的数据转换时,当Model类中数据为Decimal,int,bool类型时,直接去接收数据库的数据如果数据库数据为Null会报错, 如:Name= Reader.GetDecimal...

    1.在查询数据中,判断某个字段是否为空,不能用 字段!=null,要使用SQL专用判断 字段 is not null

    2.在程序中取SQL查询的数据转换时,当Model类中数据为Decimal,int,bool类型时,直接去接收数据库的数据如果数据库数据为Null会报错,
    如:Name= Reader.GetDecimal(reader, “Name”);这种写法如果数据库Name为Null,这里的程序就会出错。

    遇到这种情况大家都能想到需要事先判断下字段数据库中是否Null就可以了,等于Null给一个初始值0,不等于就赋值,如下写法:Name= Reader.GetDecimal(reader, “Name”)==Null ?0:Reader.GetDecimal(reader, “Name”);

    这样写依旧报错,因为对于接收数据库数据Null的判断用DBNull,所以正确写法如下:
    Name= Reader.GetDecimal(reader, “Name”)==DBNull ?0:Reader.GetDecimal(reader, “Name”);

    展开全文
  • sqlserver批量修改null及空字符串

    千次阅读 2019-04-19 18:29:35
    sqlserver批量修改null及空字符串 在做数据迁移的过程中总会出现各种始料不及的问题,原始库中的数据总会多出不少的冗余数据或无效数据,最近工作需要需要将sqlserver数据库中的所有表存在的空字符串以及null替换为...

    sqlserver批量修改null及空字符串

    在做数据迁移的过程中总会出现各种始料不及的问题,原始库中的数据总会多出不少的冗余数据或无效数据,最近工作需要需要将sqlserver数据库中的所有表存在的空字符串以及null替换为"NaN",今天来研究一下sqlserver中的空字符串以及null

    null 和空字符串"的区别

    null不指向任何对象,没有任何值,而空字符串"代表一个长度为0的字符串

    假如有个字段是money,null可以理解为 “我有没有钱关你啥事儿 ”,而 空字符"表示“我真的没有钱,我就是个穷B”,那么数据存储中空值到底用NULL还是空字符,这个争议比较多,根据个人需要吧,区别不大。个人习惯用null值,毕竟sqlserver中有isnull()函数是可以方便的检索null值,这个对于业务上的一些处理比较方便,另外是isnull()函数是不能识别空字符的,这也与我们为什么要写下面的sql脚本。

    如何来解决整个数据库的替换

    整个替换逻辑大致就是循环数据库表,然后循环表中所有字段,将所有的字段检索替换一遍。逻辑简单,主要是语法上的书写。

    需要用到的SQL语句

    -- 查询表中所有字段名
    select name from syscolumns where id=object_id('TEST01')
    -- 查询数据库所有表名
    select table_name from information_schema.tables 
    

    单表修改

    declare @colname  varchar(100),
            @sql      varchar(8000),
    		@count int,
    		@num int				
    SET @sql=''
    SET @num=1
    select @count=count(*) from syscolumns where id=object_id('TEST01')
    while @num <= @count 
    BEGIN
    	select  @colname=name from syscolumns s where id=object_id('TEST01') and colid = @num
        set @sql='update TEST01 set '+@colname+'=''NaN'''+'where '+@colname+'='''' or '+@colname+' is NULL'
    	exec (@sql)
    	set @num=@num +1 
    end ;
    

    这个比较简单 ,查询出表中字段数量,然后查询表中所有字段名,根据数量来循环更新语句。需要注意的是拼接sql语句不要漏掉引号。稍微修改一下,做个存储过程,如下:

    单表存储过程

    create procedure test_table_update
    @tablename varchar(100)
    as
    declare @colname  varchar(100),
            @sql      varchar(8000),
    		@count int,
    		@num int				
    SET @sql=''
    SET @num=1
    select @count=count(*) from syscolumns where id=object_id(@tablename)
    while @num <= @count 
    BEGIN
    	select  @colname=name from syscolumns s where id=object_id(@tablename) and colid = @num
        set @sql='update '+@tablename+' set '+@colname+'=''NaN'''+'where '+@colname+'='''' or '+@colname+' is NULL'
    	exec (@sql)
    	set @num=@num +1 
    end ;
    

    数据库修改

    use 数据库名;
    declare @tableName  varchar(100),  -- 表名
    		@tableCount  varchar(100), -- 表数量
    		@colname  varchar(100),    -- 字段名
    		@sql      varchar(8000),  -- 执行sql
    		@count int,  -- 字段数量
    		@num int,   -- 字段数量初始
    		@tableNum int -- 表数量初始
    SET @tableNum=1
    select @tableCount=count(*) from information_schema.tables  --@tableCount赋值为表数量
    while @tableNum <= @tableCount -- 循环表
    BEGIN
    	select @tableName=table_name from (select row_number() over ( order by table_name) as row ,* from information_schema.tables) t  where t.row =@tableNum  -- 给查询到的表名赋予序号并按序号查询
    	select @count=count(*) from syscolumns where id=object_id(@tableName) 
    				SET @num=1
    				while @num <= @count  -- 循环字段
    						 BEGIN
    								select  @colname=name from syscolumns s where id=object_id(@tableName) and colid = @num  -- 查询字段名
    								set @sql='update '+@tableName+' set '+@colname+'=''NaN'''+'where '+@colname+'='''' or '+@colname+' is NULL'  --更新
    								exec (@sql)  --执行
    								set @num=@num +1  -- 下一个字段
    						end ;
    	set @tableNum=@tableNum +1  -- 下一张表
    end ;
    

    尝试用存储过程来实现数据库下所有表修改,但不同数据库不能相互操作走了弯路, 所以只能用上述的 use database;
    虽然无效,但是存储过程中拼接赋值sql带参数的写法是可以保留以供学习,有兴趣可以看看。

    ALTER procedure test_schema_update02
    @schemaName varchar(100) -- 数据库名
    as
    declare @tableName  varchar(100),  -- 表名
    		@tableCount  varchar(100), -- 表数量
    		@colname  varchar(100),    -- 字段名
            @sql      varchar(8000),  -- 执行sql
    		@count int,  -- 字段数量
    		@num int,   -- 字段数量初始
    		@tableNum int, -- 表数量初始
    		@schemaSql nvarchar(1000), -- 数据库拼接sql	
    		@schemaSql02 nvarchar(1000)							
    SET @tableNum=1
    set @schemaSql= 'select @cnt=count(*) from '+@schemaName+'.information_schema.tables'
    EXECUTE sp_executesql @schemaSql, N'@schemaName varchar(100),@cnt int OUTPUT', @schemaName = @schemaName, @cnt=@tableCount OUTPUT
    
    while @tableNum <= @tableCount -- 循环表
    BEGIN
    set @schemaSql02 = 'select @cnt=table_name from (select row_number() over ( order by table_name) as row ,* from  '+@schemaName+'.information_schema.tables) t  where t.row =@tableNum' 
    EXECUTE sp_executesql @schemaSql02, N'@schemaName varchar(100) ,@tableNum varchar(100) ,@cnt varchar(100) OUTPUT', @schemaName = @schemaName,@tableNum=@tableNum,@cnt=@tableName OUTPUT
    
    -- select @tableName=table_name from (select row_number() over ( order by table_name) as row ,* from information_schema.tables) t  where t.row =@tableNum  -- 给查询到的表名赋予序号并按序号查询
    	select @count=count(*) from syscolumns where id=object_id(@tableName) 
    				SET @num=1
    				while @num <= @count  -- 循环字段
    						 BEGIN
    								select  @colname=name from syscolumns s where id=object_id(@tableName) and colid = @num  -- 查询字段名
    								set @sql='update '+@tableName+' set '+@colname+'=''NN'''+'where '+@colname+'='''' or '+@colname+' is NULL'  --更新
    								exec (@sql)  --执行
    								set @num=@num +1  -- 下一个字段
    						end ;
    	set @tableNum=@tableNum +1  -- 下一张表
     end ;
     
    
    展开全文
  • SQL ServerNULL的正确使用与空间占用

    千次阅读 2016-01-24 19:20:34
    参考资料认识SQL Server中的NULL我们常在SQL Server的使用或维护中遇上NULL,那么什么是NULL?如下是MSDN给出的一段简短描述(见“Null Values”): A value of NULL indicates that the value is unk

    目录

    认识SQL Server中的NULL

    我们常在SQL Server的使用或维护中遇上NULL,那么什么是NULL?如下是MSDN给出的一段简短描述(见“Null Values”):

    A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.

    通俗的讲,NULL就是一个值,而且这个值是未知的(unknown);NULL不能等价任何值,甚至都不等价它自己,即NULL不等于NULL。

    为了清晰的理解上述的内容,我们创建一个测试表Test_NULL,然后对表插入2条含有NULL值的记录,并进行相关验证操作:

    --创建一张允许NULL值的表
    CREATE TABLE Test_NULL (
        num INT NOT NULL PRIMARY KEY
        ,fname NVARCHAR(50) NULL
        ,lname NVARCHAR(50) NULL
    )
    
    --对表插入4条数据:最后2条记录含有NULLINSERT INTO Test_NULL (num,fname,lname) VALUES(1, 'Tom','Jane')
    INSERT INTO Test_NULL (num,fname,lname) VALUES(2, 'Dave','')
    INSERT INTO Test_NULL (num,fname) VALUES(3, 'Aaron')
    INSERT INTO Test_NULL (num,fname) VALUES(4, 'Betty')

    为了验证NULL值是未知的,我们通过如下SQL查询表Test_NULL的记录,对lname字段进行=操作:

    --若两个NULL是可以相等的,那么将输出4条记录。实际只输出2条记录
    SELECT
        *
    FROM Test_NULL tn 
    LEFT JOIN Test_NULL g
        ON tn.num = g.num
    WHERE tn.lname = g.lname
    ------------------------------------------
    1   Tom Jane    1   Tom Jane
    2   Dave        2   Dave    
    
    --查询lname为''的记录,即验证NULL不等于''
    SELECT
        *
    FROM Test_NULL tn
    WHERE tn.lname = ''
    ------------------------------------------
    2   Dave    

    正确查询/使用SQL Server中的NULL

    由于NULL是未知的,因此在SQL Server默认情况下我们不能使用=或<>去判断或查询一条NULL的记录(见上述),正确的方式是:使用IS NULL或IS NOT NULL去查询或过滤一条含有NULL的记录。

    另外有函数ISNULL(),可判断并转换NULL为其他值。

    --通过IS NULL查询含有NULL的记录
    SELECT
        *
    FROM Test_NULL tn
    WHERE tn.lname IS NULL
    ------------------------------------------
    3   Aaron   NULL
    4   Betty   NULL
    
    --NULL不等于任何值,甚至NULL不等于NULL
    --默认不能使用<>或=匹配NULL
    SELECT
        *
    FROM Test_NULL tn
    WHERE tn.lname <> NULL OR tn.lname = NULL
    ------------------------------------------

    但需注意:SQL Server仅是在默认情况下不能使用=或<>,当设置ANSI_NULLS为OFF后,即可使用=或<>查询NULL值

    换言之,SQL Server默认是开启ANSI_NULLS选项的。

    --设置ANSI_NULLS为OFF,并使用=NULL查询记录
    SET ANSI_NULLS OFF
    SELECT
        *
    FROM Test_NULL tn
    WHERE tn.lname = NULL
    ------------------------------------------
    3   Aaron   NULL
    4   Betty   NULL

    插入或更新NULL值:

    --插入1条含有NULL的新记录
    INSERT INTO Test_NULL (num,fname,lname) VALUES(5, 'Serena', NULL)
    
    --更新某条记录的字段值为NULL
    UPDATE Test_NULL SET fname = NULL
    WHERE num = 2

    NULL的空间占用

    通常的认识是:NULL在可变长类型(如nvarchar(50),varchar(8))中是不占用空间的,在固定长度的类型(如int)中会占用存储空间。

    实际上,上述的认识不够严谨。真实情况是,NULL在可变长与固定长度的类型中均会占用空间

    在SQL Server非Sparse Columns中,存储NULL的值需1个bit的NULL bitmap mask。

    参考资料

    1. Null Values
      https://msdn.microsoft.com/en-us/library/ms191504.aspx

    2. Use Sparse Columns
      https://msdn.microsoft.com/en-us/library/cc280604.aspx

    展开全文
  • Excel数据导入Sql Server出现Null

    千次阅读 2017-07-17 12:48:09
    SQLServer过程中,SQLServer会做出判断,是采用float型还是nvarchar型来接受数据,测试发现(没有科学依据),SQLServer采用哪一型取决于将要导入 的数据中本身具有哪一型的记录数比例多,如10笔数据,有4笔没有
  • SQL Server里的 ISNULLNULLIF

    万次阅读 2011-12-26 17:00:10
    SQL Server 中有两个参数,语法:  ISNULL(check_expression, replacement_value) check_expression 与 replacement_value 数据类型必须一致  如果 check_expression 为 NULL,则返回 replacement_value 如果...
  • SQL Server查询null

    千次阅读 2018-06-08 11:31:06
    select News_Status,* from dbo.web_office a left join web_news b on a.office_id = b.News_Office_ID and News_Model_id = '0105' and News_Status <>'X' ...第二张方法是给null一个空值,查询结果如下:
  • sqlserver减法一定要特别注意:int或者float类型字段减去为null的数值结果为null,对于数值一定要记得加上isnull来判断不为null
  • Sql server 判断某个字段(tim)不为null:tim is not null; 判断某个字段不为空字符串:tim !=' ';
  • sql server1.替换null:isnull(arg,value)如:select isnull(price,0.0) from orders2.与null比较: is not null,is null如:select * from orders where price i
  • SQL SERVER判断字段是否为NULL

    千次阅读 2018-11-30 15:01:06
    @[TOC](SQL SERVER判断字段是否为NULL的例子)https://yq.aliyun.com/ziliao/3863 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细...
  • sql server isnull 和 case cast 函数

    千次阅读 2010-10-19 15:22:00
    sql server isnull 和 case cast 函数
  • sql server 数据库中null 转换为 0

    千次阅读 2019-04-25 19:17:37
    sql server 数据库中null 转换为 0
  • SQL Server中 ISNULLNULLIF的用法

    千次阅读 2018-12-19 10:35:33
    SQL Server 中有两个参数,语法:  ISNULL(check_expression, replacement_value) check_expression 与 replacement_value 数据类型必须一致  如果 check_expression 为 NULL,则返回 replacement_value 如果 ...
  • SQL Server里的 ISNULL 与 Oracle 中的 NULLIF不同: SQL Server 中有两个参数,语法: ISNULL(check_expression, replacement_value) check_expression 与 replacement_value 数据类型必须一致 如果 check_...
  • SQL Server ISNULL 不生效原因

    千次阅读 2019-02-19 11:58:56
    数据库:SQL Server 2008 R2 原始SQL:historyval 字段没有数据显示为NULL,用ISNULL判断为NULL的时候替换为 0.0 SELECT ISNULL(historyval, 0.0) FROM ce_bf_l_energyh_t_2 WHERE tagname = '123'   问题...
  • SQL SERVER输入空值NULL

    千次阅读 2011-12-17 17:37:09
    按Ctrl+0即可
  • SQL Server UPDATE NULL值遇到的坑

    千次阅读 2019-04-26 10:25:02
    表设计结构( num字段 本应设置为非NULL,默认值为0) 此时如果执行 UPDATE testNUM SET num= num + 11 WHERE id=2 则执行反馈为 但表中字段值仍旧未改变 当然,修改下相关字段设计:非NULL,默认为0 即可 ...
  • SQL ServerNULL的比较问题

    千次阅读 2017-03-13 14:53:13
    SQL ServerNull值并不是一个值,而是表示特定含义,其所表示的含义是“Unknow”,可以理解为未定义或者未知,因此任何与Null值进行比对的二元操作符结果一定为Null,包括Null值本身。而在SQL Server中,Null值的...
  • SqlServer(null) vs C#(null,DBNull)

    千次阅读 2009-10-23 15:14:00
    SqlServernull类型表示这个字段没有值,可以用于各种数据类型字段;C#的null类型表示空引用,可以用于各种引用类型变量;同时又提供了System.DBNull类型,用于对SqlServernull的支持;关系举例如下:1)C#执行...
  • sqlserver excel导入数据时有null,最完美解决办法 1、说明为什么会出现导入的数据会为null? 因为在数据库导入数据时,他会自动检测数据的类型,文字一般检测为nvarchar类型,而数字则为float类型,字符+数字,...
  • SQL Server中:select isnull(num,0) from table1 --如果num字段中的值为NULL时,将显示为0 而Access中的isnull函数,只是用来判断一个表达式或是字段是否Null,返回的是布尔值(True/False),但是结合iif...
  • 由于服务器设置不当导致sqlserver的某个字段为空,导致部分内容显示失败,所有这里需要将为空的字符替换为制定的字符
  • ![图片说明](https://img-ask.csdn.net/upload/201606/01/1464781407_201116.png)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 362,108
精华内容 144,843
关键字:

nullsqlserver更新