Хранимая процедура NULL Параметр - PullRequest
6 голосов
/ 04 марта 2011

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

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:

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

Ответы [ 3 ]

6 голосов
/ 04 марта 2011

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

2 голосов
/ 05 марта 2011

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

UPDATE Foo         
SET             
      ShortName = ISNULL(@ShortName, ShortName)
     , Sort = ISNULL(@Sort, Sort)
WHERE Id = @Id;
0 голосов
/ 04 марта 2011

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

...