存储过程NULL参数

rpf*_*pf3 6 sql null stored-procedures optional-parameters

我有一个数据库表我试图用存储过程进行UPDATE/INSERT.让我们像这样定义表:

CREATE TABLE Foo
(
    Id           INT             IDENTITY(1, 1),
    Name         VARCHAR(256)    NOT NULL,
    ShortName    VARCHAR(32),
    Sort         INT
);
Run Code Online (Sandbox Code Playgroud)

我写了一个类似于以下的存储过程:

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;
Run Code Online (Sandbox Code Playgroud)

我已经大大简化了我正在处理的数据结构,但我希望这符合我的观点.我的问题是如何处理参数.有没有办法在程序中确定@Sort是否通过参数列表中的默认声明传入为NULL或设置为NULL?

编辑:

这样做的目的是我不希望NULL参数覆盖UPDATE语句中的任何列,除非它们以这种方式显式传递.

小智 6

不,你无法检测@Sort如何变为NULL.如果您的目标是捕获何时显式设置而不是默认值设置,我建议使用不同的默认值(可能是通常不会使用的默认值,如-1).然后您可以假设如果@Sort为NULL,则显式传入,但如果为-1,则表示默认设置为@.