【问题标题】:How to pass column names in a SQL query as parameters using report builder 3.0如何使用报表生成器 3.0 将 SQL 查询中的列名作为参数传递
【发布时间】:2017-05-09 21:05:21
【问题描述】:

我在“SQL Server Reporting Services 2012”上使用“Microsoft SQL Server Report Builder 3.0”。

从主报告 main.rdl 我调用钻取报告 detail.rdl

main.rdl 报表有一个表格,该表格的每个文本框都是可点击和钻取操作。当用户单击任何文本框时,将调用 detail.rdl 报告。传递给 detail.rdl 报告的一个参数用作 SQL 中的列名。此 SQL 获取 detail.rdl 报告所需的数据

当我对使用参数构建的 detail.rdl 报告运行 SQL 查询时,它没有显示任何错误,但也没有获取任何数据。我认为发生的情况是,由于参数的数据类型为文本,它在 SQL 中被替换为引号,这可能导致它无法获取任何数据。

当我用参数值(不带引号)替换列名后直接在 DB 上运行相同的 SQL 时,它会获取数据。

是否有任何特定的方法来传递将用作我在这里缺少的列名的参数?

我正在从报表生成器尝试的 SQL:

SELECT
  table_name.column1
  ,table_name.column21
  ,table_name.column15
  ,table_name.column6
  ,table_name.column9
  ,table_name.column2
  ,table_name.column19
  ,@column --the value in this variable is an existing column name from table table_name
FROM
  table_name
WHERE
  table_name.column1 LIKE @company
  AND table_name.column21 LIKE @platform
  AND (@column is null OR @column = '' OR @column = 'N/A' OR @column = 'Unknown');--I want to use same variable here as well

更新: 我能够通过添加

来使 SQL 正常工作
DECLARE @company varchar(10)
SET @company = ''company_name''
DECLARE @platform varchar(10)
SET @platform = ''platform_name''

行后

SET @SQL =
'

不幸的是,“Microsoft SQL Server Report Builder 3.0”无法执行此 SQL,因为它要求变量 @SQL 的值,即使它的值已定义。我确实尝试在同一行中声明和设置@SQL 的值:

DECLARE @SQL varchar(5000) = 'DECLARE @company varchar(10)

但是报告生成器仍然要求@SQL 的值并且报告没有运行:-(

【问题讨论】:

  • 问题是我的错。参数名称区分大小写,因此请确保它在任何地方都读取“@SQL”,最后一条语句将其作为“@sql”。SSRS 可能还在设计器中添加了一个“@sql”参数,如果这样你可以安全地删除它.

标签: sql sql-server ssrs-2012 reportbuilder3.0


【解决方案1】:

如果不查看您的代码,很难判断问题出在哪里,但您不能像(我认为)您正在尝试做的那样交换 SQL 中的字符串。

要测试您的 SQL,只需在 Management Studio 中执行一些简单的操作,例如

DECLARE @MyParm varchar(256) = 'myColumnName'
SELECT *, @MyParm FROM myTable 

这将返回 MyTable 中的所有列,加上一个字符串值“myColumnName”作为最后一列。

如果这是您想要做的,那么您可能需要更改您的 SQL 以使用动态 SQL,类似这样。

DECLARE @MyParm varchar(256) = 'myCOlumnName'
DECLARE @SQL varchar(max)

SET @SQL = 'SELECT *, ' + @MyParm + ' FROM myTable'

EXEC (@SQL)

如果我完全错了,请发布一些示例代码,以便我们了解您的尝试。

编辑:这是基于您的示例代码的具体答案

DECLARE @Column sysname = 'Column999'
DECLARE @SQL varchar(max)

SET @SQL = 
'SELECT 
    table_name.column1 ,table_name.column21 ,table_name.column15 ,table_name.column6 
    ,table_name.column9 ,table_name.column2 ,table_name.column19 
    ,' + @column + 
    ' FROM table_name 
    WHERE table_name.company LIKE @company 
        AND table_name.platform LIKE @platform 
        AND (' + @column + ' is null OR ' + @column + ' = '''' OR ' + @column + ' = ''N/A'' OR ' + @column + ' = ''Unknown'')'

-- uncomment below to check SQL statement is correct
--print @sql

-- exec the SQL statement
exec (@sql)

就目前而言,这将执行以下sql

SELECT 
    table_name.column1 ,table_name.column21 ,table_name.column15 ,table_name.column6 
    ,table_name.column9 ,table_name.column2 ,table_name.column19 
    ,Column999 FROM table_name 
    WHERE table_name.company LIKE @company 
        AND table_name.platform LIKE @platform 
        AND (Column999 is null OR Column999 = '' OR Column999 = 'N/A' OR Column999 = 'Unknown')

【讨论】:

  • 感谢您的回复。这是我想要做的:SELECT table_name.column1 ,table_name.column21 ,table_name.column15 ,table_name.column6 ,table_name.column9 ,table_name.column2 ,table_name.column19 ,@column --the value in this variable is an existing column name from table table_name FROM table_name WHERE table_name.company LIKE @company AND table_name.platform LIKE @platform AND (@column is null OR @column = '' OR @column = 'N/A' OR @column = 'Unknown');--I want to use same variable here as well
  • 我已经编辑了我的答案以匹配您的具体示例
  • 很抱歉再次打扰您,但是如何声明和设置@company 和@platform?我在DECLARE @Column sysname = 'Column999' 行之后尝试过DECLARE @company varchar(10) = 'company_name' 和DECLARE @platform varchar(10) = 'platform_name',但查询失败并出现错误:必须声明标量变量“@company”。我尝试在不同的行上声明和设置,但仍然得到同样的错误。
  • 用您建议的解决方案更新了我的问题。不幸的是,“Microsoft SQL Server Report Builder 3.0”不适用于此 SQL。所以我仍在寻找其他资源/选项。
  • 问题是我的错。参数名称区分大小写,因此请确保它在任何地方都读取“@SQL”,最后一条语句将其作为“@sql”。SSRS 可能还在设计器中添加了一个“@sql”参数,如果这样你可以安全地删除它.
猜你喜欢
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 2020-05-02
  • 2013-02-07
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多