2015-06-18 5 views
1

В SQL Server 2008 мне нужно иметь возможность передавать параметр, который позволяет использовать все значения, конкретные значения или несколько значений. Ниже sql работает нормально, когда параметр «Все». И отлично работает с одним значением. Но с несколькими значениями я получаю «Msg 4145, Level 15, State 1, Line 7 Выражение небулевого типа, указанное в контексте, где ожидается условие, рядом с ','." Я пробовал несколько вещей, но не получал.Параметр SQL в where, который допускает все, конкретные или несколько значений

--Works fine 
 
Declare @sql varchar(8000) 
 
,@p_CODE varchar(100) 
 
,@v_CODE VARCHAR(100) 
 
Set @p_CODE = ('''All''') 
 
Set @v_CODE = @p_CODE 
 
select @sql = 'SELECT distinct 
 
\t CODE 
 
\t FROM \t TABLE 
 
\t WHERE \t '[email protected]_CODE+' in ('+'''All'''+') 
 
\t \t or CODE in ('[email protected]_CODE+')' 
 
Execute (@sql) 
 
--Returns all records \t 
 
\t 
 
\t 
 
--Works fine \t \t 
 
Declare @sql varchar(8000) 
 
,@p_CODE varchar(100) 
 
,@v_CODE VARCHAR(100) 
 
Set @p_CODE = ('''ABCD''') 
 
Set @v_CODE = @p_CODE 
 
select @sql = 'SELECT distinct 
 
\t CODE 
 
\t FROM \t TABLE 
 
\t WHERE \t '[email protected]_CODE+' in ('+'''All'''+') 
 
\t \t or CODE in ('[email protected]_CODE+')' 
 
Execute (@sql) \t \t 
 
--Returns records with ABCD 
 

 

 
--Returns error as noted 
 
Declare @sql varchar(8000) 
 
,@p_CODE varchar(100) 
 
,@v_CODE VARCHAR(100) 
 
Set @p_CODE = ('''ABCD'',''EFGH''') 
 
Set @v_CODE = @p_CODE 
 
select @sql = 'SELECT distinct 
 
\t CODE 
 
\t FROM \t TABLE 
 
\t WHERE \t '[email protected]_CODE+' in ('+'''All'''+') 
 
\t \t or CODE in ('[email protected]_CODE+')' 
 
Execute (@sql)

ответ

0

Левая сторона госпитализацию должно быть выражение, но ваш код сделал это не так, это:

SELECT distinct 
    CODE 
    FROM TABLE 
    WHERE 'ABCD','EFGH' in ('All') 
     or CODE in ('ABCD','EFGH') 

Что вы можете увидеть это ваш первый в проблема не вторая.

Вам нужно изменить вам код логики, как:

Declare @sql varchar(8000) 
,@v_CODE VARCHAR(100) 
select @sql = 'SELECT distinct 
    CODE 
    FROM TABLE 
    ' + CASE WHEN @v_CODE IS NULL THEN '' ELSE ' WHERE CODE in ('[email protected]_CODE+')' END 

Execute (@sql) 

А также я считаю, что есть некоторые лучший способ выполнить это. Если сбор слишком велик, IN может вызвать проблемы с производительностью.

+0

Спасибо Саймон, но это не возвращает никаких результатов, и он должен ... 'Признаться @sql VARCHAR (8000) , @p_CODE VARCHAR (100) , @ v_CODE VARCHAR (100) Set @p_CODE = ('' 'ABCD' ' '' EFGH ''') Set @v_CODE = @p_CODE выберите @sql = «SELECT отчетливый \t КОД \t ОТ \t ТАБЛИЦА \t WHER E \t CODE IS NULL ИЛИ КОД в ('+ @ v_CODE +') \t ' Execute (@sql) мне нужно, чтобы иметь возможность вернуть все результаты. Thx – write2dougr

+0

Извините, я сделал ошибку, и ясно, что я не был в ясном сознании. :) Я изменил ответ и, пожалуйста, проверьте обновленный ответ. –

0

Это работает (как раз в обратном ин) ...

Declare @sql varchar(8000) 
,@p_CODE varchar(100) 
,@v_CODE VARCHAR(100) 
Set @p_CODE = ('''ABCD'',''EFGH''') 
Set @v_CODE = @p_CODE 
select @sql = 'SELECT distinct 
    CODE 
    FROM TABLE 
    WHERE CODE in ('[email protected]_CODE+') 
     OR (''All'' in ('[email protected]_CODE+') 
      AND CODE in (SELECT DISTINCT 
          CODE 
          FROM TABLE))' 
Execute (@sql)