【问题标题】:Can a SELECT statement use variables containing field names?SELECT 语句可以使用包含字段名称的变量吗?
【发布时间】:2021-07-28 08:42:48
【问题描述】:

我正在使用带有 SSMS17 的 SQL Server 2008R2,并尝试根据当前数据自动生成一些“最少使用字段”报告。理想情况下,我想将这些字段的列表检索到表变量中,然后创建一个 SELECT 语句,在其中我将记录 ID 与这些最少使用字段的值一起提取,但变量解析为文本而不是字段姓名。我正在尝试的可能吗?

这是一个使用已知字段名称的简化示例:

    DECLARE @f1 as nvarchar(20) = 'MySpaceID';
    DECLARE @f2 as nvarchar(20) = 'FaxNum';
    DECLARE @f3 as nvarchar(20) = 'PagerNum';
    
    SELECT [ID], [FullName], @f1 as Field1, @f2 as Field2, @f3 as Field3
    FROM tblContacts
    WHERE @f1 is not null
       OR @f2 is not null
       OR @f3 is not null;

我得到的是作为输出的变量值。

    f1          f2      f3
    ----------  ------  ---------
    MySpaceID   FaxNum  PagerNum
    MySpaceID   FaxNum  PagerNum
    MySpaceID   FaxNum  PagerNum

这可行吗?

谢谢。

【问题讨论】:

  • 您需要使用变量动态构建 SQL 查询字符串,然后直接执行该查询字符串。
  • 谢谢,@TimBiegeleisen。我正在研究如何正确地做到这一点。
  • 谢谢,@Squirrel。很棒的信息!我需要一些时间来理解它。
  • TL;DR;始终在注入的对象/列名称上使用QUOTENAME,根据sys.objects/sys.columns 验证名称,始终使用nvarchar 而不是varchar,在可能的情况下始终通过sp_executesql 传递实际数据的参数,从不聚合合并变量(使用STRING_AGGFOR XML

标签: sql-server tsql variables dynamic dynamicquery


【解决方案1】:
EXEC('SELECT [ID], [FullName], ' + @f1 + ' as Field1, ' + @f2 + ' as Field2,' + @f3 + ' as Field3
      FROM tblContacts
      WHERE ' +  @f1 + ' IS NOT NULL
         OR ' +  @f2 + ' IS NOT NULL
         OR ' +  @f3 + ' IS NOT NULL')

【讨论】:

  • 谢谢,@premprasath。在阅读“动态 SQL 的诅咒和祝福”后,我试图避免使用 EXEC,但我没有看到任何其他方法来创建动态语句,其中 SELECT 子句包含字段名称的变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 2015-08-28
  • 2013-02-20
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多