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?

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top