Несколько входов предложения WHERE в хранимую процедуру T-SQL - PullRequest
2 голосов
/ 16 сентября 2010

У меня есть список с множественным выбором в веб-форме, в котором перечислены различные внутренние коды активности, и пользователи могут фильтровать результаты запроса на основе выбранных кодов.Я могу легко добавить один код в качестве параметра к моей хранимой процедуре и отфильтровать результаты с помощью предложения WHERE, например, так:

WHERE ActivityCode = @ActivityCode OR @ActivityCode is null 

, но как лучше всего обрабатывать несколько кодов, особенно если числовыбранные коды являются произвольными?

Ответы [ 3 ]

4 голосов
/ 16 сентября 2010
where isnull(@ActivityCode, ActivityCode) = ActivityCode 
3 голосов
/ 16 сентября 2010

Вы можете использовать WHERE ActivityCode IN (@Code1, @Code2) OR ActivityCode IS NULL

2 голосов
/ 16 сентября 2010

Это:

WHERE ActivityCode = @ActivityCode OR @ActivityCode is null 

... работает, но не sargable .

Если у вас есть только один необязательный параметр, вы можете использовать IF:

IF @ActivityCode IS NOT NULL
BEGIN

  SELECT ...
    FROM ...
   WHERE ActivityCode = @ActivityCode

END
ELSE
BEGIN

  SELECT ...
    FROM ...

END

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

SQL Server 2005 +

DECLARE @SQL NVARCHAR(MAX)
    SET @SQL = N'SELECT ...
                   FROM ... 
                  WHERE 1 = 1 '

    SET @SQL = @SQL + CASE 
                         WHEN @ActivityCode IS NOT NULL THEN ' AND ActivityCode IN (@ActivityCode) '
                         ELSE ' '
                      END

BEGIN

  EXEC sp_executesql @SQL, N'@ActivityCode VARCHAR(100)', @ActivityCode

END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...