2013-03-20 2 views
2

Я получаю значения, разделенные запятыми, как это в переменной (скажем имя переменной @listobj)значения, разделенные запятыми в SQL Statement от переменной

'abc' , 'xyz' 

, но когда я использую ниже заявление он не дает мне правильный результат

SELECT * FROM someTable 
Where column1 IN (@listobj) 

, но abc присутствует в таблице.

Где я делаю это неправильно?

+0

Эта ссылка обсуждает проблему в деталях: http://www.williamrobertson.net/documents/comma-separated.html – guruprasath

+0

Возможный дубликат [Параметрирование предложения SQL IN?] (http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause) – icc97

ответ

2

создать функцию, которая разделить строку на

CREATE FUNCTION dbo.Split(@String varchar(8000), @Delimiter char(1))  

возвращается @tempta Таблица BLE (пункты VARCHAR (8000))
, как
начинают
DECLARE @idx Int
объявлять @slice VARCHAR (8000)

выберите @idx = 1
, если Len (@String) < 1 или @String является недействительным возврат

в то время как @idx! = 0
начинают
множество @idx = CHARINDEX (@ разделитель, @ String)
если @idx! = 0
набор @slice = левый (@ String, @ IDX - 1)
еще
множества @slice = @String

if(len(@slice)>0) 
    insert into @temptable(Items) values(@slice)  

set @String = right(@String,len(@String) - @idx)  
if len(@String) = 0 break  

конец возвращение
конец

затем сделать вызов функции SELECT * FROM someTable Где column1 IN (dbo.Split (@listobj))

enter link description here

0

Классический вопрос и ответ - нет, вы не можете использовать параметр таким образом. Существует несколько обходных решений:

Один из них - разобрать значение внутри хранимой процедуры и динамически генерировать sql внутри процедуры, которая будет выполнена позже. Однако это не очень хорошая практика.

Обратитесь к этому вопросу

How to pass a comma separated list to a stored procedure?

, а также некоторые хорошие дискуссии по нему здесь

http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/1ccdd39e-8d58-45b2-9c21-5c4dbd857f95/

1

SQLFiddle demo

select * from someTable 
where ','+LTRIM(RTRIM(@listobj))+',' LIKE '%,'+LTRIM(RTRIM(column1))+',%' 
+0

Это не работает. Когда я делаю жестко закодированное значение, тогда он работает нормально, но не с переменной :( – Zerotoinfinity

+0

@Zerotoinfinite: Я думаю, что это потому, что 'column1' или' @ listobj' имеет пробелы в конце. Например, они не VARCHAR (), но CHAR(). Я изменил SQL для решения этой проблемы. – valex

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