TSQL Передает многозначный параметр служб Reporting Services в динамический SQL
-
23-08-2019 - |
Вопрос
Дубликат: Манипуляция строкой TSQL varchar
Я создаю динамическую инструкцию SQL на основе параметров из отчета служб reporting services.Службы Reporting services передают параметры MutiValue в базовом формате CSV.Например, список состояний может быть представлен следующим образом:Ал, Калифорния, Нью-Йорк, Теннесси, Вирджиния
В инструкции SQL это нормально:
WHERE customerState In (@StateList)
Однако динамический вариант не подходит:
SET @WhereClause1 = @WhereClause1 + 'AND customerState IN (' + @StateList + ') '
Это потому, что он преобразуется в (недопустимый SQL):
AND customerState IN (AL,CA,NY,TN,VA)
Для обработки этого нужно что-то вроде этого:
AND customerState IN ('AL','CA','NY','TN','VA')
Есть ли какое-нибудь классное выражение, которое я могу использовать для вставки одинарных кавычек в мой динамический SQL?
Решение 3
Это позаботится о середине:
УСТАНОВИТЬ @StateList = ЗАМЕНИТЬ(@StateList, ',', "',"')
Затем заключите края в кавычки:
УСТАНОВИТЕ @WhereClause1 = @WhereClause1 + 'И customerState В ("' + @StateList + "') '
Другие советы
REPLACE по какой-то причине не сработал у меня при использовании с IN.В итоге я использовал ХАРИНДЕКС
WHERE CHARINDEX( ',' + customerState + ',', ',' + @StateList + ',' ) > 0
Для всех, кто пытается использовать динамический SQL с многозначным параметром в предложении where И использовать его для запуска отчета SSRS, вот как я это обошел...
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
Конечно, проблема с этим запросом заключается в том, что динамический SQL выберет все из dbo.table, а затем фильтр будет выбран из #temp, поэтому, если есть большой объем данных - это, вероятно, не так уж и здорово.Но...Я был разочарован, пытаясь заставить REPLACE работать или любые другие решения, опубликованные другими.