基于 R 存储过程过滤 SSRS 报告?
Filter a SSRS report based on a R stored procedure?
有没有人知道如何参数化或过滤 sp_execute_external_script?例如,我想在带有日期过滤器的 SSRS 报告中使用它。
我找到的解决方案使用临时 table 但我想找到一个更简单和更可靠的解决方案。
目标是消除对临时 table 的需求。
这是代码:
Declare @id nvarchar(3)='1'
drop table if exists #TempTable
select * into #TempTable from (
select 0 id,1234 as Col
union
select 1 id, 12
union
select 2 id, 985
) as a1
where id=@id
EXECUTE sp_execute_external_script
@language = N'R',
@script = N'OutputDataSet <- InputDataSet',
@input_data_1 = N'select col from #TempTable'
WITH RESULT SETS((columnName char (11)))
我相信我可以将其放入存储过程并使用 id 作为参数,然后将其用于 SSRS。但必须有更简单的方法。我已经尝试过 Dynamical sql 方式,但它不起作用。有任何想法吗?
指定参数的最简单方法是在报表的命令文本中包含参数或变量。执行以下操作:
在包含 sp_execute_external_script SP 调用的数据库中创建一个过程。您也可以直接使用 sp_execute_external_script。例如:
创建过程sqlr_test_sp (@input int)
作为
开始
exec sp_execute_external_script @language = N'R', @script = N'OutputDataSet <- as.data.frame(input);', @input_data_1 = N'', @params = N'@输入 int', @input = @input;
结尾;
去
在 SSRS 报告中,添加以下作为数据集的命令文本。例如,Report Builder 将自动创建名为“@input”的参数。您可以从参数属性
中设置默认值等
exec sqlr_test_sp @input
谢谢乌玛钱达尔。您的脚本在存储过程的 R 部分中使用了一个参数。为了使用 SSRS 的参数,我还需要过滤 input_data。
简而言之,该技术是使用@params 变量声明变量,然后分别定义每个参数。在存储过程的 R 部分中,我们使用不带 @ 的变量。另一方面,在存储过程的 SQL 语句部分,我们使用带有 @ 前缀的变量(请参见下图)。
你可以通过运行这段代码测试一下,看看图片上的评论。
Declare @id nvarchar(3)='2'
Declare @anInteger int=17
drop table if exists #TempTable
select * into #TempTable from (
select 0 id,0 as Col
union
select 1 id, 100
union
select 2 id, 200
union
select 3 id, 300
) as a1
EXECUTE sp_execute_external_script
@language = N'R'
, @script = N'ThisIsThe_result <- ThisIsThe_inputSQL*aParamCalled_ID+aParamCalled_ID2'
, @input_data_1 = N'select col from #TempTable where id in(@aParamCalled_ID,1)'
, @input_data_1_name = N'ThisIsThe_inputSQL'
, @output_data_1_name = N'ThisIsThe_result'
, @params=N'@aParamCalled_ID int, @aParamCalled_ID2 int'
, @aParamCalled_ID= @id
, @aParamCalled_ID2=@anInteger
WITH RESULT SETS((columnName char (11)))
评论如下:
有没有人知道如何参数化或过滤 sp_execute_external_script?例如,我想在带有日期过滤器的 SSRS 报告中使用它。 我找到的解决方案使用临时 table 但我想找到一个更简单和更可靠的解决方案。 目标是消除对临时 table 的需求。 这是代码:
Declare @id nvarchar(3)='1'
drop table if exists #TempTable
select * into #TempTable from (
select 0 id,1234 as Col
union
select 1 id, 12
union
select 2 id, 985
) as a1
where id=@id
EXECUTE sp_execute_external_script
@language = N'R',
@script = N'OutputDataSet <- InputDataSet',
@input_data_1 = N'select col from #TempTable'
WITH RESULT SETS((columnName char (11)))
我相信我可以将其放入存储过程并使用 id 作为参数,然后将其用于 SSRS。但必须有更简单的方法。我已经尝试过 Dynamical sql 方式,但它不起作用。有任何想法吗?
指定参数的最简单方法是在报表的命令文本中包含参数或变量。执行以下操作:
在包含 sp_execute_external_script SP 调用的数据库中创建一个过程。您也可以直接使用 sp_execute_external_script。例如:
创建过程sqlr_test_sp (@input int) 作为 开始 exec sp_execute_external_script @language = N'R', @script = N'OutputDataSet <- as.data.frame(input);', @input_data_1 = N'', @params = N'@输入 int', @input = @input; 结尾; 去
在 SSRS 报告中,添加以下作为数据集的命令文本。例如,Report Builder 将自动创建名为“@input”的参数。您可以从参数属性
中设置默认值等exec sqlr_test_sp @input
谢谢乌玛钱达尔。您的脚本在存储过程的 R 部分中使用了一个参数。为了使用 SSRS 的参数,我还需要过滤 input_data。
简而言之,该技术是使用@params 变量声明变量,然后分别定义每个参数。在存储过程的 R 部分中,我们使用不带 @ 的变量。另一方面,在存储过程的 SQL 语句部分,我们使用带有 @ 前缀的变量(请参见下图)。
你可以通过运行这段代码测试一下,看看图片上的评论。
Declare @id nvarchar(3)='2'
Declare @anInteger int=17
drop table if exists #TempTable
select * into #TempTable from (
select 0 id,0 as Col
union
select 1 id, 100
union
select 2 id, 200
union
select 3 id, 300
) as a1
EXECUTE sp_execute_external_script
@language = N'R'
, @script = N'ThisIsThe_result <- ThisIsThe_inputSQL*aParamCalled_ID+aParamCalled_ID2'
, @input_data_1 = N'select col from #TempTable where id in(@aParamCalled_ID,1)'
, @input_data_1_name = N'ThisIsThe_inputSQL'
, @output_data_1_name = N'ThisIsThe_result'
, @params=N'@aParamCalled_ID int, @aParamCalled_ID2 int'
, @aParamCalled_ID= @id
, @aParamCalled_ID2=@anInteger
WITH RESULT SETS((columnName char (11)))
评论如下: