2016-06-07 1 views
0

Est-ce que quelqu'un a trouvé comment paramétrer ou filtrer le sp_execute_external_script? Je veux utiliser cela dans un rapport SSRS avec un filtre de date par exemple. La solution que j'ai trouvée utilise une table temporaire, mais j'aimerais trouver une solution plus simple et une solution plus fiable. L'objectif est de supprimer le besoin d'une table temporaire. Voici le code:Filtrer un rapport SSRS basé sur une procédure stockée R?

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))) 

Je crois que je pourrais mettre cela en une procédure stockée et utiliser comme paramètre l'identifiant puis utiliser dans SSRS. Mais il doit y avoir un moyen plus simple. J'ai essayé la méthode Dynamical sql et ça ne marche pas. Des idées?

Répondre

1

Merci Umachandar. Votre script utilise un paramètre dans la section R de la procédure stockée. Afin d'utiliser un paramètre pour le SSRS, j'ai besoin de filtrer les input_data aussi. En résumé, la technique consiste à déclarer les variables à l'aide de la variable @params, puis à définir chaque paramètre séparément. Dans la section R de la procédure stockée, nous utilisons la variable sans @. D'autre part, dans la partie instruction SQL de la procédure stockée, nous utilisons la variable préfixée d'un @ (voir l'image ci-dessous).

Vous pouvez tester cela en exécutant ce code et regarder les commentaires sur l'image.

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))) 

Voici les commentaires:

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

0

La manière la plus simple de spécifier un paramètre consiste à inclure un paramètre ou une variable dans le texte de commande du rapport. Procédez comme suit:

  1. Créez une procédure dans votre base de données contenant l'appel SP sp_execute_external_script. Vous pouvez également utiliser sp_execute_external_script directement. ex:

    créer la procédure sqlr_test_sp (@input int) comme commencent exec = sp_execute_external_script @language N'R '@script = N'OutputDataSet < - as.data.frame (entrée);', @ input_data_1 = N '', @params = N '@ entrée int', @input = @input; fin; aller

  2. Dans le rapport SSRS, ajoutez ci-dessous comme texte de commande pour l'ensemble de données. Report Builder par exemple créera automatiquement le paramètre appelé "@input". Vous pouvez définir la valeur par défaut et comme des propriétés des paramètres

    exec sqlr_test_sp @input