根据R存储过程筛选SSRS报告?

问题描述:

有没有人想出如何参数化或过滤sp_execute_external_script?我想在具有日期过滤器的SSRS报告中使用它。 我找到的解决方案使用临时表,但我希望找到更简单的解决方案和更可靠的解决方案。 目标是消除对临时表的需求。 下面是代码:根据R存储过程筛选SSRS报告?

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 [email protected] 


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。但必须有更简单的方法。我已经尝试过动态SQL方式,它不起作用。有任何想法吗?

谢谢Umachandar。您的脚本在存储过程的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 
, @[email protected] 


WITH RESULT SETS((columnName char (11))) 

以下是评论:

How to creates parameters on both the SQL statement and R code

指定参数的最简单方法是在报告中的命令文本中包含参数或变量。执行以下操作:

  1. 在包含sp_execute_external_script SP调用的db中创建一个过程。您也可以直接使用sp_execute_external_script。例如:

    创建过程sqlr_test_sp(@input INT) 作为 开始 EXEC sp_execute_external_script @language = N'R '@Script = N'OutputDataSet < - as.data.frame(输入);',@ input_data_1 = N'',@params = N'@input int',@input = @input; 结束; go

  2. 在SSRS报告中,将以下添加为数据集的命令文本。例如,Report Builder将自动创建名为“@input”的参数。您可以设置从参数性能

    EXEC sqlr_test_sp默认值,这样@input