2015-07-10 4 views
0

В настоящее время у меня есть запрос, который вытащит кучу информации из моей базы данных на основе любого состояния where, которое я хочу использовать.Несколько условных Где предложение

declare @CaseNum char(7), 
     @ImportId char, 
     @FormatId char, 
     @SessionId char(5) 


set @CaseNum = '' --I can place the value that I want to search by in here 
set @ImportId = '' 
set @FormatId = '' 
set @SessionId = '' 

-------------------- 
    query in here 
-------------------- 

where 
    gr.[CaseNum] = @CaseNum --currently I have to comment the ones I'm not using out 
    --im.[ImportId] = @ImportId 
    --fr.[FormatId] = @FormatId 
    --se.[SessionId] = @SessionId 

Я хочу, чтобы быть в состоянии взять комментарий часть, и просто отображает все строки, если параметр = «»

Например, если я использую set @CaseNum = '1234567' тогда он будет искать по этому параметру, и если я использую @FormatId = '12' будет искать тот.

Я пробовал использовать следующие и несколько других попыток, но я не получаю никуда быстро.

where 
    gr.[CaseNum] = '%' + @CaseNum + '%' 
    and im.[ImportId] = '%' + @ImportId + '%' 
    and fr.[FormatId] = '%' + @FormatId + '%' 
    and se.[SessionId] = '%' + @SessionId + '%' 
+0

Вы можете использовать что-то вроде 'where (gr. [CaseNum] = @CaseNum или @CaseNum NULL) и ...', но производительность будет страдать, если вы повторно используете план выполнения. Повторная компиляция запроса для каждого набора параметров поможет, или построение запроса на флае и выполнение результирующего динамического SQL. Посмотрите на некоторые «связанные» сообщения SO, показанные в правой части страницы, и узнайте немного больше о «динамическом SQL». – HABO

ответ

1

Возможно, вы захотите изучить свой запрос.

DECLARE @Number varchar(10) 
DECLARE @Where varchar(max) 
DECLARE @Query varchar(max) 

SET @Query = 'SELECT * FROM TestTable' 
SET @Where = '' 

SET @Number = '3' 

IF ISNULL(@Number, '') != '' 
BEGIN 
    SET @Where = @Where + 'and testNumber = ' + @Number 
END 

IF LEN(@Where) > 0 
BEGIN 
    SET @Where = SUBSTRING(@Where, 4, LEN(@Where)) 
END 

if ISNULL(@Where, '') != '' 
BEGIN 
    SET @Query = @Query + ' WHERE ' + @Where 
END 

EXEC(@Query) 

Заканчивать статьи этого джентльмена для справки: https://social.msdn.microsoft.com/forums/sqlserver/en-US/1ec6ddd9-754b-4d78-8d3a-2b4da90e85dc/dynamically-building-where-clauses

+0

Это похоже на хорошее решение. Мне нужно будет проверить это в понедельник, чтобы узнать, работает ли это. –

+0

Информация, которую вы предоставили, великолепна! Я также опубликовал свое точное решение. –

1

С помощью ссылки, которая @Norman публикуемого я понял это. Я хотел опубликовать свое решение для других.

declare @CaseNum varchar(MAX), 
     @ImportId varchar(MAX) 


set @CaseNum = '' 
set @ImportId = '' 
---------------------------------------------------------------------------- 

If(@CaseNum = '') --Sets the parameter to NULL for COALESCE to work 
Begin 
    Select @CaseNum = NULL 
End 

If(@ImportId = '') --Sets the parameter to NULL for COALESCE to work 
Begin 
    Select @ImportId = NULL 
End 

-------------------- 
    query in here 
-------------------- 

where 
    gr.[CaseNum] = COALESCE(@CaseNum, gr.[CaseNum]) 
    and im.ImportId = COALESCE(@ImportId, im.ImportId) 

Это решение позволяет использовать только один параметр или все одновременно.

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