不给变量赋值,就默认为null
null与其他值运算,都是null

解决方案 »

  1.   

    按着常理,变量没有赋值,它应该输出字符vvvsqlserver的常理是没有赋值的变量是null,而null加任何东西都为null...
      

  2.   


    declare   @str   varchar(300) 
    declare   @int   int --Set   @str   =   '' 
    --Set   @int   =   '' Print   'vvv'   +   @str   +   Cast(@int   as   Varchar) -----------------楼主是自己理解错了吧,当没有对变量给初值时,值 为null ,null+任何值=null
    所以 print 出来结果是什么也没有,但把print 改为 select 时就会显示 null.
    当对变量赋值时,结果当然是vvv0 了.
      

  3.   


    有没有什么办法让不为变量赋值也能输出vvv啊?
    declare   @str   varchar(300) 
    declare   @int   int print   'vvv'   +   isnull(@str,'')   +   Cast(isnull(@int,'')   as   Varchar) --
    vvv0
      

  4.   

    declare @str varchar(300)
    declare @str2 varchar(300)Set @str = 'Select * From pubs.dbo.employee'
    --Set @str2 = null
    exec (@str + @str2)奇怪啊,既然null加任何东西都为null,那我这样执行后为何还能输出值呢?
      

  5.   

    而且你的@int是int,
    如果set @int=''
    那其實@int是=0
      

  6.   

    declare   @str   varchar(300) 
    declare   @int   int --Set   @str   =   '' 
    --Set   @int   =   '' Print   'vvv'   +   isnull(@str,'')   +   Cast(isnull(@int,'')   as   Varchar) 
    ----
    vvv0结果是这样让我有些吃惊。
    为什么是vvv0 而不是vvv呢?
    应该 isnull(@int,''),这里搞的鬼 isnull 之后,‘’变成了整型的了,而''的整型转成字符之后就成了0。看declare @i int 
    select cast (isnull(@i ,'') as varchar) as v,isnull(@i ,'') as b 
    v                              b           
    ------------------------------ ----------- 
    0                              0(所影响的行数为 1 行)
    现在不吃惊了,因为之前有了解过null是有类型的...
      

  7.   


    --请楼主来试试,这样有没有结果???declare   @str   varchar(300) 
    declare   @str2   varchar(300) 
    declare @s varchar(1000)Set  @str   =   'Select   *   From   pubs.dbo.employee' 
    set @s=@str+@str2exec   (@s) 
      

  8.   

    那怎么样让@int用isnull转换后连0都没有了呢?或是用其它的办法replace替换下?
      

  9.   

    declare   @str   varchar(40) 
    declare   @str2   varchar(20) Set   @str   =   'Select * From pubs.dbo.employee' 
    --Set   @str2   =   null 
    select @str+ @str2 as a
    exec  (@str   +   @str2) a                                                            
    ------------------------------------------------------------ 
    NULL
    emp_id    fname                minit lname                          job_id job_lvl pub_id hire_date                                              
    --------- -------------------- ----- ------------------------------ ------ ------- ------ ------------------------------------------------------ 
    PMA42628M Paolo                M     Accorti                        13     35      0877   1992-08-27 00:00:00.000
    PSA89086M Pedro                S     Afonso                         14     89      1389   1990-12-24 00:00:00.000--吓我一跳,难道是exec 有自己的优化了吧...
    --试试
    exec null
    -- 服务器: 消息 156,级别 15,状态 1,行 1
    -- 在关键字 'null' 附近有语法错误。
    --------------------------------------------
    --不行。
    --说明exec干掉了null
      

  10.   

    发表于:2007-12-03 10:39:318楼 得分:0 --请楼主来试试,这样有没有结果??? SQL code
    declare   @str   varchar(300) 
    declare   @str2   varchar(300) 
    declare @s varchar(1000)Set  @str   =   'Select   *   From   pubs.dbo.employee' 
    set @s=@str+@str2exec   (@s) 
     
    ------------
    肯定木有...的
      

  11.   

    那怎么样让@int用isnull转换后连0都没有了呢?或是用其它的办法replace替换下?-------------
    那你就不要用 @int 为int型的...改成varchar的。
      

  12.   


    declare   @str   varchar(300) 
    declare   @str2   varchar(300) 
    declare @s varchar(1000)Set  @str   =   'Select   *   From   pubs.dbo.employee' 
    set @s=@str+@str2exec   (@s)
    declare @str   varchar(300)  
    declare @s varchar(1000)Set  @str = 'Select   *   From   pubs.dbo.employee' 
    set @s=@str
    exec   (@s)
    我崩溃了,这两段代码各位高手分别执行执行看输出,同样的Sql语句,居然一个输出命令已成功完成,一个输出表格。这都什么破毛病啊!
      

  13.   

    第一个是肯定没有结果的。因为@str+@str2=null,所有@s 也是null
    第二个是有结果的,@str 是有初值的,所有@s也是有初值所以"同样的Sql语句,居然一个输出命令已成功完成,一个输出表格。" 这是完全正确的
      

  14.   

    lz
    你仔细分析一下 你上面两个@s的值再做比较好吗?不是相同的东西的。
      

  15.   

    那怎么样让@int用isnull转换后连0都没有了呢?或是用其它的办法replace替换下?
    declare   @str   varchar(300) 
    declare   @int   int select   'vvv'   +   isnull(@str,'')   + case when @int is null then '' else cast(@int as varchar) end/*
                                                                                                                
    vvv(所影响的行数为 1 行)
    */