今天碰到一个这样的问题:
declare @id int
select @id=5
select @id=id from tab where id=1
select @id
猜猜结果?
1、当tab存在id=1的记录,@id=1
2、当tab不存在id=1的记录,@id=5           --我以为会是null呢各位大侠还碰到什么容易让人误解的地方没,帖出来,以后大家也好注意点啊。

解决方案 »

  1.   

    换一种写法就会是null了
    select @id=(select id from tab where id=1)
      

  2.   

    恩,确实是这样的。
    补充一点
    declare @id int 
    --select @id=5   不执行这一句
    select @id=id from tab where id=1 
    select @id将开始的赋值语句不执行,如果id为1的不存在,那么结果又会是null了。为什么会这样呢?
      

  3.   

    如里id=1不存在,@id将会保持默认值,@id默认值为null
      

  4.   

    那你用这句为什么又不保持了呢?
    select @id=(select id from tab where id=1)
      

  5.   

    举个例子:
    create table #T (id int)
    insert into #T select 2declare @id int
    --select @id=5 --没有设置初始值
    select @id=id from #T where id=1
    select @id --那么下面的变量@sql就会变成null,那么exec(null)是不会报错的
    declare @sql varchar(8000)
    set @sql='update tb set col=5 where id='+ltrim(@id)
    exec(@sql)
    if @@error<>0 
    ...
    else
    ...
      

  6.   

    这个特别是在动态拼sql串时,字符串+null=null,所以用@@error捕获没有错误,而造成exec成功的假象.
    在复杂的存储过程中难以排查。所以,如果不能确定变量必定有值,那么请赋一个初始值给他,是有必要的。
      

  7.   

    因为select @id=5是赋值语句,下面这句ID不为1,@id=id 就没执行 @id默认值就是NULL了