【问题标题】:SQL Server variable columns name?SQL Server 变量列名?
【发布时间】:2010-04-28 06:59:07
【问题描述】:

我想知道为什么我不能使用这样的变量列名:

declare @a as varchar;
set @a='TEST'

select @a from x;

谢谢

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您不能这样做,因为 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,则不应这样做。

    【讨论】:

    【解决方案2】:

    因为列名是在 SQL 语句的编译时而不是在运行时解析的。

    【讨论】:

      【解决方案3】:

      因为这是不允许的。

      您可以使用动态 sql 查询:

      declare @a as varchar;
      set @a='TEST'
      exec ('select ' + @a + ' from x')
      

      【讨论】:

      • 问题是为什么不允许这样做,而不是如何解决它。我看不出用“因为它是不允许的”来回答很有帮助。
      • @David M:是的,这只是一种解决方法。你的回答很有帮助
      • 感谢exec - 它比exec sp_executesql 等等更容易记住。我记得这个 SP 总是出错,比如“不允许执行这个过程”。
      【解决方案4】:

      为此使用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'''
          ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        • 2018-01-24
        • 2012-03-13
        • 1970-01-01
        相关资源
        最近更新 更多