TSQL Passing mehrwertig Reporting Services Parameter in dynamischem SQL
-
23-08-2019 - |
Frage
Duplizieren von : TSQL varchar String-Manipulation
Ich baue eine dynamische SQL-Anweisung aus Parametern aus einem Reporting Services-Bericht. Reporting Services geht MutiValue Parameter in einem Grund CSV-Format. Zum Beispiel eine Liste von Staaten kann wie folgt dargestellt werden: AL, CA, NY, TN, VA
In einer SQL-Anweisung das ist OK:
WHERE customerState In (@StateList)
Allerdings ist die dynamische Variante ist nicht OK:
SET @WhereClause1 = @WhereClause1 + 'AND customerState IN (' + @StateList + ') '
Das ist, weil es übersetzt (ungültige SQL):
AND customerState IN (AL,CA,NY,TN,VA)
So verarbeitet es so etwas wie dies benötigt:
AND customerState IN ('AL','CA','NY','TN','VA')
Gibt es einen kühlen Ausdruck, den ich die einfachen Anführungszeichen in meine dynamische SQL einfügen können?
Lösung 3
Diese kümmert sich um die Mitte:
SET @StateList = REPLACE (@StateList, ' ' ''', ''')
Dann zitieren die Kanten:
SET @ WhereClause1 = @ WhereClause1 + 'und customerState IN (' '' + @StateList + '' ')
Andere Tipps
REPLACE nicht für mich arbeiten, wenn sie mit IN aus irgendeinem Grund verwendet. Ich landete mit CHARINDEX
WHERE CHARINDEX( ',' + customerState + ',', ',' + @StateList + ',' ) > 0
Für alle versuchen, dynamischen SQL zu verwenden, um mit einem mehrwertigen Parameter in der where-Klausel und es zu verwenden, einen SSRS-Bericht zu laufen, das ist, wie ich um ihn herum ...
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
Zugegeben, das ist das Problem mit dieser Abfrage, dass die dynamische SQL alles von dbo.table zu wählen, und dann der Auswahl von #temp ist, wo die Filter in Kicks, also wenn es eine große Menge von Daten - es ist wahrscheinlich nicht so groß. Aber ... ich habe frustriert versucht, Arbeit zu bekommen REPLACE, oder andere Lösungen andere hatten geschrieben.