TSQL Passando valores múltiplos Reporting Services parâmetro em SQL Dinâmico
-
23-08-2019 - |
Pergunta
Duplicate de : TSQL varchar manipulação de string
Estou construindo uma instrução SQL dinâmica de parâmetros de um relatório de serviços de informação. Reporting Services passa MutiValue Parâmetros em um formato básico CSV. Por exemplo, uma lista de estados pode ser representada da seguinte maneira: AL, CA, NY, TN, VA
Em uma instrução SQL este é OK:
WHERE customerState In (@StateList)
No entanto, a variante dinâmica não é OK:
SET @WhereClause1 = @WhereClause1 + 'AND customerState IN (' + @StateList + ') '
Isso é porque ele se traduz em SQL (inválido):
AND customerState IN (AL,CA,NY,TN,VA)
Para processar ele precisa de algo como isto:
AND customerState IN ('AL','CA','NY','TN','VA')
Existe alguma expressão legal que eu posso usar para inserir as aspas simples no meu SQL dinâmico?
Solução 3
Esta cuida do meio:
SET @StateList = REPLACE (@StateList, ' ' ''', ''')
Em seguida, citar as bordas:
SET @ WhereClause1 = @ WhereClause1 + 'E customerState IN (' '' + @StateList + '' ')'
Outras dicas
Substituir não funcionou para mim quando usado com IN por algum motivo. Acabei usando CHARINDEX
WHERE CHARINDEX( ',' + customerState + ',', ',' + @StateList + ',' ) > 0
Para qualquer tentativa de usar o Dynamic SQL com um parâmetro de vários valores na cláusula WHERE e usá-lo para executar um relatório do SSRS, é assim que eu tenho em torno dele ...
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
Com certeza, o problema com esta consulta é que o SQL dinâmico irá selecionar tudo, desde dbo.table, e então a escolha de #temp é onde o filtro é ativado, por isso, se há uma grande quantidade de dados - provavelmente não é tão ótimo. Mas ... eu fiquei frustrado tentando se substituir ao trabalho, ou quaisquer outras soluções de outros tinha postado.