【问题标题】:Can you use a parameter to reference a column in a select statement?您可以使用参数来引用 select 语句中的列吗?
【发布时间】:2021-06-23 17:17:54
【问题描述】:

我正在尝试基于参数引用表列。我的 where 子句的最后一行是

'GRAD_' +LEFT(@REPORTING_DATE-20000,4) LIKE '%' + @PROGRAM + '%'

我希望我的代码看起来像 GRAD_2018 LIKE '%BIOL%',但是当我运行代码时,我在结果集中得到一个“0”,我知道我应该得到 18。

下面是我的示例代码


DECLARE
@REPORTING_DATE INT,
@PROGRAM VARCHAR(4)

SET @REPORTING_DATE = '20201101'
SET @PROGRAM = 'BIOL'

SELECT COUNT(ID) 
FROM PROGRAM_DATA
WHERE PROGRAM LIKE '%' + @PROGRAM + '%' AND REPORT_DATE IN (@REPORTING_DATE-60000) AND
 'GRAD_' +LEFT(@REPORTING_DATE-20000,4) LIKE '%' + @PROGRAM + '%'

我正在使用 MSSQL 和 SSRS。

【问题讨论】:

  • 需要这样做表明您的数据模型存在缺陷。您将值存储在应位于单独行中的列中。
  • 你不是也想把@PROGRAM 当作一列吗?如果不是,那么@PROGRAM LIKE '%' + @PROGRAM + '%' 毫无意义,因为(用文字替换变量)'BIOL' 总是像'%BIOL%'。您对IN 的使用也会误导读者,因为您过滤了一个特定值 - 可以很容易地用相等替换 (REPORT_DATE = ...)
  • 我拥有的数据表的格式不正确,无法满足我的要求,因此我对其进行了修改,以便能够运行正确的脚本。

标签: sql sql-server reporting-services parameters where-clause


【解决方案1】:

很遗憾,您不能引用这样的字段。您需要使用动态 SQL 来执行此操作。

您将 SQL 构建为字符串,然后执行它。

DECLARE @SQL VARCHAR(8000)

SET @SQL ='
SELECT COUNT(ID) 
FROM PROGRAM_DATA
WHERE @PROGRAM LIKE ''%' + @PROGRAM + '%'' 
    AND REPORT_DATE IN (''' + @REPORTING_DATE-60000 + ''') 
    AND GRAD_' + LEFT(@REPORTING_DATE-20000,4) + ' LIKE ''%''' + @PROGRAM + '''%''
    '

EXEC(@SQL);

【讨论】:

    【解决方案2】:

    在 SSRS 中执行此操作的另一种方法是从表达式创建数据集。

    在此示例中,我假设您实际上想要从报告参数中传递变量值。

    创建参数来保存两个变量,称为pReportDatepProgram

    在数据集属性中,单击查询 [fx] 对应的表达式按钮。

    确保包含等号并将整个 sql 语句设置在引号中。

    ="
    SELECT COUNT(ID) 
    FROM PROGRAM_DATA
    WHERE PROGRAM LIKE '%" & Parameters!pProgram.Value & "%' AND REPORT_DATE IN (" & Parameters!pReportDate.Value & "-60000) AND
     'GRAD_' +LEFT(&" Parameters!pReportDate.Value &"-20000,4) LIKE '%" & Parameters!pProgram.Value & "%'"
    

    我还假设 @PROGRAM 是你的 where 子句第一部分的错字。

    这种方法的缺点是您可能必须手动将所有查询字段添加到数据集中,因为 SSRS 可能无法自动检测到它们。

    【讨论】:

      【解决方案3】:

      再想一想...由于表通常具有固定数量的列,您是否考虑过编写 where 子句来简单地用适用于您的情况的“and”或“or”拼出所有列?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-16
        • 2011-02-08
        • 1970-01-01
        • 2013-02-20
        • 2010-11-05
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多