Domanda

Duplica di : TSQL manipolazione delle stringhe varchar

Sto costruendo un'istruzione SQL dinamica di parametri da un rapporto di servizi di segnalazione. Reporting Services passa MutiValue parametri in un formato di base CSV. Per esempio un elenco di stati può essere rappresentata come segue: AL, CA, NY, TN, VA

In una dichiarazione SQL questo è OK:

WHERE customerState In (@StateList) 

Tuttavia, la variante dinamica non è OK:

SET @WhereClause1 = @WhereClause1 + 'AND customerState IN (' + @StateList + ') '

Questo perché si traduce in (SQL non valido):

AND customerState IN (AL,CA,NY,TN,VA)

Per elaborare ha bisogno di qualcosa di simile:

AND customerState IN ('AL','CA','NY','TN','VA')

C'è qualche espressione fresca posso utilizzare per inserire le virgolette singole nella mia SQL dinamico?

È stato utile?

Soluzione 3

Questo si prende cura del mezzo:

SET @StateList = REPLACE (@StateList, ' ' ''', ''')

Poi citare i bordi:

SET @ WhereClause1 = @ WhereClause1 + 'E customerState IN (' '' + @StateList + '' ')'

Altri suggerimenti

REPLACE non ha funzionato per me quando viene utilizzato con IN per qualche ragione. Ho finito per usare CHARINDEX

WHERE CHARINDEX( ',' + customerState + ',', ',' + @StateList + ',' ) > 0

Per chiunque si tenta di utilizzare SQL dinamico con un parametro multivalore nella clausola WHERE e usarlo per eseguire un report SSRS, questo è come mi sono intorno ad esso ...

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

Certo, il problema con questa query è che l'SQL dinamico selezionare tutto da dbo.table, e poi l'selezionare dalla #temp è dove il filtro entra in gioco, quindi se c'è una grande quantità di dati - è probabilmente non così grande. Ma ... mi sono frustrato cercando di ottenere REPLACE al lavoro, o di qualsiasi altra soluzione gli altri aveva postato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top