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?
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, ',')
)
declare @Vendors_Filter nvarchar(max) = 'a,b,c'
declare @Vendors nvarchar(max)
set @Vendors =''''+replace(@Vendors_Filter,',',''',''')+''''
select @Vendors