根据R存储过程过滤SSRS报告?

时间:2016-06-07 10:49:04

标签: r reporting-services sql-server-2016

有没有人想出如何参数化或过滤sp_execute_external_script?我想在带有日期过滤器的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 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。但必须有更简单的方法。我尝试过动态sql方式但它不起作用。有任何想法吗?

2 个答案:

答案 0 :(得分:1)

谢谢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 
, @aParamCalled_ID2=@anInteger


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

以下是评论:

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

答案 1 :(得分:0)

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

  1. 在db中创建一个包含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&lt; - as.data.frame(input);',@ input_data_1 = N'',@ params = N'@ input int',@ input = @input; 结束; 去

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

    设置默认值等

    exec sqlr_test_sp @input