想象一下,我们有以下声明:
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)
语句中是非法的?
答案 0 :(得分:1)
语法。我们知道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);