Параметр null хранимой процедуры

у меня есть таблица базы данных, в которую я пытаюсь выполнить обновление/вставку с помощью хранимой процедуры. Давайте определим таблицу так:

CREATE TABLE Foo
(
    Id           INT             IDENTITY(1, 1),
    Name         VARCHAR(256)    NOT NULL,
    ShortName    VARCHAR(32),
    Sort         INT
);

Я написал хранимую процедуру, подобную следующей:

CREATE PROCEDURE Put_Foo
(
    @Id           INT             = NULL OUTPUT,
    @Name         VARCHAR(256),
    @ShortName    VARCHAR(32)     = NULL,
    @Sort         INT             = NULL
)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        @Id = F.Id
    FROM
        Foo AS F
    WHERE
        F.Name = @Name;

    IF (@Id IS NOT NULL)
    BEGIN
        UPDATE
            Foo
        SET
            ShortName    = @ShortName,
            Sort         = @Sort
        WHERE
            Id = @Id;
    END
    ELSE
    BEGIN
        INSERT
        INTO Foo
        (
            Name,
            ShortName,
            Sort
        )
        VALUES
        (
            @Name,
            @ShortName
            @Sort
        );

        SET @Id = SCOPE_IDENTITY();
    END

    RETURN;
END;

Я значительно упростил структуры данных, с которыми имею дело, но я надеюсь, что это служит моей точке зрения. Мой вопрос касается того, как обрабатываются параметры. Есть ли способ определить в рамках процедуры, был ли @Sort передан как NULL или установлен NULL по объявлению по умолчанию в списке параметров?

EDIT:

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

3 ответов


нет, вы не можете определить, как @Sort стал NULL. Если ваша цель-захватить, когда он явно установлен по умолчанию, я бы предложил использовать другое значение по умолчанию (возможно, то, которое обычно не используется, например -1). Тогда вы можете предположить, что если @Sort равен NULL, он был явно передан, но если он равен -1, вы знаете, что он был установлен по умолчанию.


Я думаю, что это то, что ищете. Если один из параметров равен null, он будет updatedit со значением в базе данных. Другой вариант-обновлять по одному столбцу за раз.

UPDATE Foo         
SET             
      ShortName = ISNULL(@ShortName, ShortName)
     , Sort = ISNULL(@Sort, Sort)
WHERE Id = @Id;

выньте значение по умолчанию, а затем код, вызывающий proc, должен предоставить значение (либо реальное значение, либо NULL)