如何使用报表生成器 3.0 将 SQL 查询中的列名作为参数传递
How to pass column names in a SQL query as parameters using report builder 3.0
我在 "SQL Server Reporting Services 2012" 上使用 "Microsoft SQL Server Report Builder 3.0"。
来自主报表 main.rdl 我正在调用钻取报表 detail.rdl
main.rdl 报表有一个 table,此 table 的每个文本框都是可单击和钻取操作。当用户单击任何文本框时,将调用 detail.rdl 报告。传递给 detail.rdl 报告的一个参数用作 SQL 中的列名称。此 SQL 获取 detail.rdl 报告
所需的数据
当我 运行 SQL 查询使用参数构建的 detail.rdl 报告时,它没有显示任何错误,但也没有获取任何数据。我认为正在发生的事情是,由于参数的数据类型为文本,它在 SQL 中被引号替换,这可能导致它无法获取任何数据。
当我 运行 在用参数值(不带引号)替换列名后直接在数据库上 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,只需在 Management Studio 中做一些简单的事情,例如
DECLARE @MyParm varchar(256) = 'myColumnName'
SELECT *, @MyParm FROM myTable
这将 return MyTable 中的所有列,加上字符串值 'myColumnName' 作为最后一列。
如果这是您想要做的,那么您可能需要将 SQL 更改为使用动态 SQL,类似这样。
DECLARE @MyParm varchar(256) = 'myCOlumnName'
DECLARE @SQL varchar(max)
SET @SQL = 'SELECT *, ' + @MyParm + ' FROM myTable'
EXEC (@SQL)
如果我完全弄错了,请 post 一些示例代码,以便我们了解您的尝试。
编辑:这是基于您的示例代码的具体答案
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')
我在 "SQL Server Reporting Services 2012" 上使用 "Microsoft SQL Server Report Builder 3.0"。
来自主报表 main.rdl 我正在调用钻取报表 detail.rdl
main.rdl 报表有一个 table,此 table 的每个文本框都是可单击和钻取操作。当用户单击任何文本框时,将调用 detail.rdl 报告。传递给 detail.rdl 报告的一个参数用作 SQL 中的列名称。此 SQL 获取 detail.rdl 报告
所需的数据当我 运行 SQL 查询使用参数构建的 detail.rdl 报告时,它没有显示任何错误,但也没有获取任何数据。我认为正在发生的事情是,由于参数的数据类型为文本,它在 SQL 中被引号替换,这可能导致它无法获取任何数据。
当我 运行 在用参数值(不带引号)替换列名后直接在数据库上 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,只需在 Management Studio 中做一些简单的事情,例如
DECLARE @MyParm varchar(256) = 'myColumnName'
SELECT *, @MyParm FROM myTable
这将 return MyTable 中的所有列,加上字符串值 'myColumnName' 作为最后一列。
如果这是您想要做的,那么您可能需要将 SQL 更改为使用动态 SQL,类似这样。
DECLARE @MyParm varchar(256) = 'myCOlumnName'
DECLARE @SQL varchar(max)
SET @SQL = 'SELECT *, ' + @MyParm + ' FROM myTable'
EXEC (@SQL)
如果我完全弄错了,请 post 一些示例代码,以便我们了解您的尝试。
编辑:这是基于您的示例代码的具体答案
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')