web-dev-qa-db-fra.com

Passage to the value of SSRS in a stock procedure

J'essaie de passer un paramètre de chaîne de valeurs multiples à un paramètre de type de table dans une procédure stockée SQL Server 2012. Je colle ce code dans le jeu de données de SSRS:

DECLARE @mylist clinic_list_tbltype
INSERT @mylist(n) VALUES (@pm_ChooseClinics)
EXEC sp_Skillset_Summary_With_Callbacks_Report @mylist, @pm_ChooseInterval, @pm_StartDateTime, @pm_EndDateTime

clinic_list_tbltype est un type de table que j'ai créé avec un champ varchar (50) nommé "n". Je peux appeler cette procédure stockée à partir de SSMS o.k. comme ça (et ça revient très vite):

DECLARE @mylist clinic_list_tbltype
INSERT @mylist(n) VALUES ('clinicA'), ('clinicB')
EXEC sp_Skillset_Summary_With_Callbacks_Report  @mylist, 'Daily', '6/3/2014', '6/9/2014'

Je ne peux participer à SSRS que pour une seule clinique (mais très lentement), mais si j'en essaie plusieurs, cela donne une erreur en disant que 

il y a moins de colonnes dans l'instruction INSERT que de valeurs spécifiées dans la clause Values

. Même si cela fonctionne pour un seul client, cela fonctionne, mais cela prend beaucoup de temps comparé à l'exécution de la requête dans SSMS. Comme 2 minutes contre 1 seconde. Doit être parce que je passe ('cliniqueA', 'cliniqueB') au lieu de ('cliniqueA'), ('cliniqueB'). 

Comment faire?

10
urbanmojo

Bon je dois te donner un peu de retour en premier. 

Lorsque vous autorisez le paramètre SSRS à sélectionner plusieurs valeurs, la sélection de plusieurs valeurs crée une chaîne de valeurs délimitée par des virgules sous la forme d'une chaîne. 

  'value1,value2,value3'

Pour vérifier les valeurs dans une chaîne en utilisant l'opérateur IN, nous avons besoin de chaînes concaténées avec des virgules, quelque chose comme ceci ....

  'value1','value2','value3'

Votre Proc

Maintenant, dans votre proc, lorsque vous insérez explicitement des valeurs, il insère plusieurs valeurs dans votre table.

  INSERT INTO Table_Value_Param
  VALUES ('value1'),       --<-- 1st value/Row
         ('value2'),       --<-- 2nd Value/Row
         ('value3')        --<-- 3rd Value/Row

et cela vous redonne les résultats escomptés comme lorsque, dans votre procédure, vous exécutez une instruction telle que 

SELECT * 
FROM Table_Name
WHERE ColumnName IN (SELECT ColumnName 
                     FROM Table_Value_Param)

Par contre, lorsque vous essayez d’insérer dans une table à l’aide de rapport SSRS, vous insérez une valeur dans la table, comme 

  INSERT INTO Table_Value_Param
  VALUES ('value1,value2,value3')   --<-- One Row/Value containing all the values comma separated

Solution

Créer TVP dans cette situation ne m'aide pas vraiment. Ce que je fais est d'utiliser la fonction dbo.Split() dans ma procédure.

Vous pouvez trouver de nombreuses définitions de la fonction split en ligne. Pour quelques unes intéressantes, regardez ici Split Function equivalent in tsql?

Une fois que vous avez créé cette fonction de division, utilisez-la simplement dans la définition de votre procédure. Vous n'avez même pas besoin des paramètres de valeur Table. 

Quelque chose comme ça...

  SELECT * 
  FROM Table_Name 
  WHERE ColumnName IN ( 
                       SELECT Value
                       FROM dbo.Split(@Report_Param, ',')
                       ) 
7
M.Ali
declare @Vendors_Filter nvarchar(max) = 'a,b,c'
declare @Vendors nvarchar(max) 
set @Vendors =''''+replace(@Vendors_Filter,',',''',''')+'''' 
select @Vendors
0
Voucik