【发布时间】:2010-04-28 06:59:07
【问题描述】:
我想知道为什么我不能使用这样的变量列名:
declare @a as varchar;
set @a='TEST'
select @a from x;
谢谢
【问题讨论】:
标签: sql-server tsql
我想知道为什么我不能使用这样的变量列名:
declare @a as varchar;
set @a='TEST'
select @a from x;
谢谢
【问题讨论】:
标签: sql-server tsql
您不能这样做,因为 SQL 在知道 @a 的值是什么之前就已编译(我假设实际上您希望 @a 是某个参数,而不是像您的示例中那样硬编码)。
您可以这样做:
declare @a as varchar;
set @a='TEST'
declare @sql nvarchar(max)
set @sql = 'select [' + replace(@a, '''', '''''') + '] from x'
exec sp_executesql @sql
但请注意,这是一个安全漏洞(sql 注入攻击),因此如果您不能信任或无法很好地清理 @a,则不应这样做。
【讨论】:
因为列名是在 SQL 语句的编译时而不是在运行时解析的。
【讨论】:
因为这是不允许的。
您可以使用动态 sql 查询:
declare @a as varchar;
set @a='TEST'
exec ('select ' + @a + ' from x')
【讨论】:
exec - 它比exec sp_executesql 等等更容易记住。我记得这个 SP 总是出错,比如“不允许执行这个过程”。
为此使用sp_executesql
Example
SET @SQLString = N'SELECT *
FROM table1
WHERE timet = @time and items in (@item)';
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
SET @ParmDefinition = N'@time timestamp,
@item varchar(max) ';
EXECUTE sp_executesql
@SQLString
,@ParmDefinition
,@time = '2010-04-26 17:15:05.667'
,@item = '''Item1'',''Item2'',''Item3'',''Item4'''
;
【讨论】: