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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top