Как включить необязательный нулевой параметр в SQL Server - PullRequest
3 голосов
/ 29 июня 2011

Я хотел бы создать хранимый процесс, который имеет необязательный параметр в части WHERE процесса.Мой код C # может передать нулевой или действительный идентификатор продукта для этого процесса.Вот оно:

declare @ProductID int
set @ProductID = null

select
    *
from
    Products
where   
    Name like '%Hasbro%'
    if @ProductID is not null
        begin
            and ProductID = @ProductID
        end

Этот код не работает.Если идентификатор продукта равен нулю, я хочу, чтобы он искал только продукты с именем «Hasbro».Если идентификатор продукта не равен NULL, я хочу, чтобы он искал продукты с именем «Hasbro» и соответствующие идентификаторы продуктов.

Спасибо!

ОБНОВЛЕНИЕ:

Вот рабочий код.Спасибо всем за помощь в получении этого!

declare @ProductID int
set @ProductID = null

select
    *
from
    Products
where
    Name like '%Hasbro%'
    and (( @ProductID is null ) or ( @ProductID is not null and ProductID = @ProductID ))

Ответы [ 2 ]

6 голосов
/ 29 июня 2011

Это должно работать также ...

select
    *
from
    Products
where
    Name like '%Hasbro%' and
    (
      ( @ProductID is null ) or
      ( @ProductID is not null and ProductID = @ProductID ) 
    )
2 голосов
/ 29 июня 2011

Более простой способ - использовать ISNULL

where
    Name like '%Hasbro%'
    and ProductID = ISNULL(@ProductID, ProductID)

Таким образом, если @ProductID опущено (т. Е. В вызове хранимой процедуры NULL), вы возвращаетесь к исходному значению, и по существу оно уменьшается до WHERE Name like '%Hasbro%' and ProductID = ProductID - вторая часть всегда будет правдой.

Хотя в соответствии с кодом, который вы опубликовали, сейчас это вообще не хранимая процедура. Просто чтобы вы знали, что у вас нет DECLARE таких параметров в SQL Server, объявление вашей хранимой процедуры будет выглядеть так:

CREATE PROCEDURE [dbo].[YourStoredProcName]
    @ProductID = NULL
AS
BEGIN
    -- stuff goes here
END

И затем, если хранимая процедура вызывается как просто EXEC YourStoredProcName, тогда @ProductID будет NULL, и этот вызов ISNULL() сработает.

<ч /> edit : за исключением того, что это не будет работать для обнуляемого столбца, что в данном случае, очевидно, так и есть. Для любого необнуляемого столбца это, вероятно, самое простое решение.

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