2016-10-03 12 views
2

У меня есть немного кода:форматирования строки параметров, чтобы быть заявление в

declare @GroupNames nvarchar(1024) 
EXEC Utility.dbo.Get_ADGroups_ForUser 'rwm132' ,@GroupNames output 
print @GroupNames 

оператор печати выглядит следующим образом:

'vQAHR','vQAResearch','vQAICT','vQAAdvancement','vAllResearch','vAllStudent','vQATeachLearn','vQAFinance','vQAHR' 

(0 row(s) affected) 

У меня есть предикат,

WHERE 
    (
RLP.ALL_GROUP_NAME IN (@GroupNames) 
) 

это не работает, как следует форматировать строку с 'так, чтобы она работала . Если я скопирую эту строку и вставим ее вместо @GroupNames в предикат, она будет работать с файлом только что-то в подстановке, которая, похоже, закручивает ее.

+0

Возможный дубликат [Передача динамических параметров хранимой процедуры в SQL Server 2008] (HTTP: // StackOverflow .com/questions/9923567/pass-dynamic-parameters-to-a-stored-procedure-in-sql-server-2008) – techspider

ответ

2

Вам нужна функция сплит строки

В SQL Server 2016 можно использовать STRING_SPLIT функцию

WHERE 
(
RLP.ALL_GROUP_NAME IN (select value from STRING_SPLIT(@GroupNames,',')) 
) 

Для предыдущей версии использовать любой из метода снизу ссылки

Split strings the right way – or the next best way

Если вы добавляете одинарные кавычки для eac значение часов внутри строки, то использовать этот

WHERE 
(
RLP.ALL_GROUP_NAME IN (select stuff(stuff(value,1,1,''),len(value)-1,1,'') from STRING_SPLIT(@GroupNames,',')) 
) 

или вы можете использовать Dynamic Sql, учитывая там обыкновение быть любая Sql инъекцией, так как это выход процедуры

declare @sql varchar(max)='' 
set @sql =' 
select .. 
WHERE 
RLP.ALL_GROUP_NAME IN ('[email protected]+') ' 

exec (@sql) 
+0

ха-ха! yest, который сработал :) –

0

Если не 2016, вы можете использовать ТВФ разбить или разобрать строку

-- Notice the single quotes surrounding each item are not necessary 
Declare @GroupNames varchar(max) = 'vQAHR,vQAResearch,vQAICT,vQAAdvancement,vAllResearch,vAllStudent,vQATeachLearn,vQAFinance,vQAHR' 

Select A.* 
From YourTable A 
Where RLP.ALL_GROUP_NAME in (Select RetVal from [dbo].[udf-Str-Parse](@GroupNames,',')) 

ОДС при необходимости

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>'+ Replace(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 

Теперь, просто для удовольствия, если вы не хотите UDF, вы можете

Select A.* 
From YourTable A 
Where RLP.ALL_GROUP_NAME In (Select Item=LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
           From (Select x = Cast('<x>'+ Replace(@GroupNames,',','</x><x>')+'</x>' as xml).query('.')) as A 
           Cross Apply x.nodes('x') AS B(i) 
          ) 
+0

Спасибо, Джон тоже работает :) –

 Смежные вопросы

  • Нет связанных вопросов^_^