存储过程NULL参数

时间:2011-03-04 20:04:07

标签: sql stored-procedures null optional-parameters

我有一个数据库表我试图用存储过程进行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?

编辑:

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

我认为这就是你要找的东西。如果其中一个参数为null,则将使用数据库中的值进行更新。另一个选项是一次更新一列。

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

答案 2 :(得分:0)

取出默认值,然后调用proc的代码必须提供一个值(实数值或NULL)