TSQL Reporting Services passage Multivalued Paramètre dans SQL dynamique
-
23-08-2019 - |
Question
en double de : TSQL manipulation de chaînes varchar
Je construis une instruction SQL dynamique sur les paramètres d'un rapport des services d'établissement de rapports. Reporting Services transmet les paramètres MutiValue dans un format CSV de base. Par exemple, une liste des états peut être représentée comme suit: AL, CA, NY, TN, VA
Dans une instruction SQL ceci est OK:
WHERE customerState In (@StateList)
Cependant, la variante dynamique n'est pas OK:
SET @WhereClause1 = @WhereClause1 + 'AND customerState IN (' + @StateList + ') '
En effet, il se traduit par (SQL non valide):
AND customerState IN (AL,CA,NY,TN,VA)
Pour traiter il faut quelque chose comme ceci:
AND customerState IN ('AL','CA','NY','TN','VA')
Y at-il une expression fraîche que je peux utiliser pour insérer les guillemets simples dans ma dynamique SQL?
La solution 3
Cela prend soin du milieu:
SET @StateList = REPLACE (@StateList, ' ' ''', ''')
citer ensuite les bords:
SET @ = @ WhereClause1 WhereClause1 + 'ET customerState IN (' '' + @StateList + '' ')'
Autres conseils
REMPLACER n'a pas fonctionné pour moi quand il est utilisé avec IN pour une raison quelconque. Je fini par utiliser CHARINDEX
WHERE CHARINDEX( ',' + customerState + ',', ',' + @StateList + ',' ) > 0
Pour toute personne qui tenterait d'utiliser SQL dynamique avec un paramètre à plusieurs valeurs dans la clause where et l'utiliser pour exécuter un rapport de SSRS, voilà comment je suis arrivé autour ...
create table #temp
(id, FName varchar(100), LName varchar(100))
declare @sqlQuery (nvarchar(max))
set @sqlQuery =
'insert into #temp
select
id,
FName,
LName
from dbo.table'
exec (@sqlQuery)
select
FName, LName
from #temp
where #temp.id in (@id) -- @id being an SSRS parameter!
drop table #temp
Certes, le problème avec cette requête est que le SQL dynamique sélectionnera tout de dbo.table, puis la sélection à partir #temp est l'endroit où le filtre entre en jeu, donc s'il y a une grande quantité de données - il est probablement pas génial. Mais ... Je suis frustré d'essayer de se REMPLACER au travail, ou d'autres solutions que d'autres avaient posté.