Параметризованный сохраненный процесс - PullRequest
0 голосов
/ 07 мая 2011

Я пишу параметризованный сохраненный процесс. Я знаю, что вы можете установить значение параметра таким образом, чтобы оно отображало все результаты, когда параметр не упоминается в команде выполнения. Но я не могу вспомнить, как это достигается. Любая помощь высоко ценится ... Пожалуйста ..

Ответы [ 3 ]

2 голосов
/ 07 мая 2011

Я бы порекомендовал параметризованный динамический sql ( sp_executesql )

Пройдя по этому маршруту, вы можете отказаться от любого несоответствующего параметра при построении предложения where.

Пример процедуры:

create proc dbo.SearchForStuff
(
 @Id int = 0
,@Description varchar(100) = ''
)
as
begin
    set nocount on;

    declare @select nvarchar(max) = '
    select
    s.*
    from Stuff as s'

    declare @where varchar(max) = ''

    if isnull(@ID,0) != 0 begin                 
        set @where += case @where when '' then ' where ' else ' and ' end + 's.Id = @Id'        
    end

    if isnull(@Description,'') != '' begin      
        set @where +=  case @where when '' then ' where ' else ' and ' end + 's.[Description] = @Description'       
    end         

    set @select += @where

    exec sp_executesql
     @select
    ,N'
    ,@Id int = 0
    ,@Description varchar(100) = '''''
    ,@Id
    ,@Description      

end

Использование:

exec SearchForStuff @Id = 1, @Description = 'omg' -- Returns every item where Id is 1 and Description is 'omg'
exec SearchForStuff @Id = 1  -- Returns every item where Id is 1
exec SearchForStuff @Description = 'omg' -- Returns every item where Description is 'omg'
exec SearchForStuff --returns every item

Таким образом, ваш последний запрос не изобилует бесполезными условиями.Кроме того, вы можете получить немного более детальный, чем я здесь.В зависимости от того, какие параметры были переданы, вы можете адаптировать предложения where / join, чтобы использовать ваши индексы таким образом, чтобы получить максимально возможную производительность.Единственным недостатком является небольшая потеря читабельности (imo).

1 голос
/ 07 мая 2011

Если это int, вы можете использовать

SELECT X,Y
FROM T
WHERE C BETWEEN COALESCE(@P, -2147483648) AND COALESCE(@P, 2147483647)

Полная статья по теме

1 голос
/ 07 мая 2011

Вы можете задать свои WHERE условия следующим образом:

WHERE (@myParam IS NULL OR @myParam = someValue)

Вы можете использовать OPTION (RECOMPILE) - это SQL2008SP1 + (или аналогичный, не знаю других опций) вsproc, в зависимости от вашей RDBMS, чтобы это было быстродействующим.

Метод из Erland Sommarskog:
http://www.sommarskog.se/dyn-search-2008.html#static

По ссылке : «Эффект всех предложений @x IS NULL заключается в том, что если этот входной параметрравен NULL, то условие AND всегда выполняется. Таким образом, действуют только те условия, в которых параметр поиска имеет значение, отличное от NULL.

Что касается удобства сопровождения, то трудно думатьлучшего решения для условий поиска. Это компактно, легко читается и расширяется. И производительность? Очень хорошо, если вы включаете подсказку запроса OPTION (RECOMPILE). Эта подсказка заставляет запрос перекомпилироваться каждый раз,в этом случае SQL Server будет использовать действительные значения переменных, как если бы они были константами. "

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