【问题标题】:Type conversion in EXEC statementEXEC 语句中的类型转换
【发布时间】:2014-11-25 22:16:35
【问题描述】:

假设我们有以下声明:

declare @a int;
set @a = 1;

并且需要生成一些信息性消息,例如:

select 'the value of @a is ' + @a;

上面的语句会产生错误,因为需要类型转换,正确的做法是:

select 'the value of @a is ' + convert(varchar(10), @a);

那么,如果同样的事情需要动态完成,人们可能会认为以下应该是正确的:

exec('select ''the value of @a is ' + convert(varchar(10), @a) + '''');

令人惊讶的是它不是,并且会产生语法错误。与select 声明相反,在这种情况下正确的做法是:

exec('select ''the value of @a is ' + @a + '''');

那么问题来了,为什么select语句需要类型转换,而exec(string)语句却是非法的?

【问题讨论】:

    标签: sql-server tsql type-conversion implicit-conversion


    【解决方案1】:

    在我们运行任何 DML 语句 时已检查语法。我们知道 Exec 不是 DML 语句,它提供 SQL 环境来运行任何脚本。 exec( 'select ''@a 的值是 ' + @a + '''') 在 exec 做隐式转换。 在这种情况下。 exec('select ''@a的值为' + convert(varchar(10), @a) + ''''); 您正在使用 convert 函数,该函数用于 DML 操作,并在 exec 之前检查语法。

    declare @a int,@str varchar(8000)=''
    set @a = 124586;
    
    select @str='select ''the value of @a is ' + convert(varchar(10), @a) + ''''
    exec( 'select ''the value of @a is ' + @a + '''')
    exec(@str);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 2017-09-11
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多