Хранимая процедура SQL: условный возврат - PullRequest
1 голос
/ 18 марта 2009

Привет, я хочу создать простой сохраненный процесс, который выполняет следующие действия:

Psudocode

@tempSelect = "SELECT * FROM Table"

if (@Param is NULL) then
 exec @tempSelect
else
 exec @tempSelect + ' WHERE id = ' + @Param + '

Эффективен ли этот метод? Спасибо.

Ответы [ 5 ]

10 голосов
/ 18 марта 2009

Попробуйте

select *
from table
where id=isnull(@param, id)
1 голос
/ 18 марта 2009

Выбрать * из таблицы Где (ID = @Param или @Param равно нулю)

Или

Выбрать * из таблицы Где ID = слияние (@Param, ID)

[И если вы стремитесь к эффективности, замените * на поле, которое вы хотите вернуть.]

0 голосов
/ 28 марта 2014

Попробуйте этот код:

CREATE PROCEDURE [dbo].[ProcedureName]
@Param varchar(50)

AS
BEGIN

declare @tempSelect nvarchar(max)  

SET NOCOUNT ON;

set @tempSelect = 'SELECT Col1, Col2 FROM Table where Col1 <> '' '

         if @Param <> '' 
    begin
    set @resultSet = @resultSet +  ''' and Col1='''+@Param1 
    end


EXEC(@resultSet)

END
0 голосов
/ 21 марта 2009

В зависимости от ситуации, я бы, вероятно, использовал динамический SQL.

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

В t-sql это выглядело бы примерно так (из моей головы и не проверялось;):

DECLARE @SQL NVARCHAR(MAX)

SET @SQL = N'
  SELECT ...
  FROM   table t
  WHERE  1 = 1' (

IF(@param IS NOT NULL)
  SET @SQL = @SQL + '
    AND t.id = @id'

... possibly more things added to the query ...

EXEC sp_executesql 
   @SQL
, '@id AS INT'
,  @id = @Param

Сделав это, вы получите оптимизированный план запросов для каждого случая (и с помощью sp_executesql также будет использоваться кэш запросов)

Я бы особенно избегал решения OR, если вы проверяете планы запросов, сгенерированные с помощью OR, по сравнению с планами без, вы поймете почему.

0 голосов
/ 18 марта 2009

Да, конечно, я не вижу в этом ничего плохого. Вы могли бы сделать это еще проще, хотя:

Set NOCOUNT On;
if (@Param is NULL) 
   Select * From Table;
else 
   Select * From Table Where (ID=@Param);

Примечание: я бы, наверное, прописал поля.

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