查询中的变量

时间:2011-05-31 12:02:19

标签: sql tsql

嗨,我有一点问题。我必须以那种方式执行查询。 在示例中,类似

declare @name varchar(max)
set @name = 'ColumnID'
select @name from Account

返回了很多'ColumnID',但我在Account表中有一个结果列ColumnID

3 个答案:

答案 0 :(得分:3)

您将要执行动态SQL语句:

exec('select ' + @name + ' from Account');

要小心过度自由地使用这些,因为它们带来了相当大的包袱:

<强>优点

  • 它提供了灵活性和可扩展性
  • 它可以减少行数 代码编写

<强>缺点

  • 它可能变得非常复杂和难以阅读。考虑嵌入引号中的引号以及其他类似的东西。
  • 它可能对代码稳定性产生不利影响。直到运行时才会知道某些动态SQL错误。 (例如,您引用不存在的表)
  • 动态SQL代码比等效的静态SQL更难测试。也可能无法测试动态SQL将遇到的每种可能情况,从而引入固有风险。
  • 在代码库中对动态SQL进行有效的影响分析会更加困难。
  • SQL注入和滥用 - 动态SQL更容易被滥用,并且总是比静态SQL更不安全
  • 动态SQL中的查询代码不受查询计划的约束,因此可能会错过此类优化。因此,它可能比等效的静态SQL慢 由于SQL查询直到运行时才知道,因此性能调优SQL可能更难
  • 动态代码(例如,确定表上可能需要的索引)

答案 1 :(得分:1)

试试这个:

declare @name varchar(max);
set @name = 'ColumnID';

exec('select ' + @name + ' from Account');

答案 2 :(得分:0)

尝试使用sp_executesql存储过程

declare @name nvarchar(20);
set @name = 'ColumnID';
declare @sql nvarchar(max)
set @sql='select ' + @name + ' from Account'
exec sp_executesql  @sql