--语句1
declare @i nvarchar(100)
set @i = null
exec(@i)/*
命令已成功完成。
*/--语句2
declare @i nvarchar(100)
set @i = ''
exec(@i)/*
命令已成功完成。
*/--语句3
exec('')/*
命令已成功完成。
*/--语句4
exec(null)/*
消息 156,级别 15,状态 1,第 1 行
关键字 'null' 附近有语法错误。
*/
我想请教为什么null放在变量里就能exec,直接用就不行

解决方案 »

  1.   


    放变量里实际执行的是  exec('null')
      

  2.   

    exec执行自定义变量,null不属于自定义
      

  3.   

    那么这个怎么解释呢declare @i int
    set @i = null
    exec(@i)
    /*
    命令已成功完成。*/
      

  4.   

    语法规定。EXEC()的括号中必须为字符串变量、字符串或字符串用“+”拼接。
      

  5.   


    执行 Transact-SQL 批中的命令字符串、字符串或执行下列模块之一:系统存储过程、用户定义存储过程、标量值用户定义函数或扩展存储过程。LZ首先要搞清楚NULL 和值为NULL
      

  6.   

    请教一下,NULL 和值为NULL有什么区别呢
      

  7.   


    declare @i nvarchar(100)
    set @i = null
    exec(@i)--@i 和 null是两个概念,一个是自定义变量,一个是值
    --例如下面同样会报错,
    exec('f')
    exec(1)
    二楼说的很明白了
      

  8.   

    结贴:
        1.execute关键字有三种语法结构,execute()是执行字符串命令,如果是用显式赋值的话,exec(1),exec(null)都属于execute关键字的语法错误。如果采用变量的话,必须是字符型以及可以转换成字符型的变量。因此对于exec(@i)当@a是int,nvarchar等是合法的,当@a是image,text等是不合法的。
        2.execute的语法验证是不包括所执行的字符串内容的语法验证,字符串内容的语法检查就相当于单独编译此字符串内容时的语法检查,因此execute('f')符合execute的语法,但是编译f时,就相当与直接在编译器中输入‘f’然后执行所报的语法错误。
        
    所以execute('null')也是错误的,但这个跟@i = null  , execute(@i)是完全不一样的,后者相当于执行一条语句,而这条语句什么内容都没有,编译器是可以通过的,执行也是可以完成的;但execute('null')相当于执行一条语句‘null’,编译器就报错了