在EXEC语句中键入转换

时间:2014-10-01 06:14:46

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

想象一下,我们有以下声明:

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)语句中是非法的?

1 个答案:

答案 0 :(得分:1)

运行任何 DML语句时,已检查

语法。我们知道Exec不是DML语句,它让SQL Enviornment运行任何脚本。 exec('select''@a的值是'+ @a +'''')在exec中执行隐式转换。 在这种情况下。 exec('select''@a的值是'+ convert(varchar(10),@ a)+''''); 您正在使用转换函数,这在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);