sql - 存储过程 NULL 参数

标签 sql stored-procedures null optional-parameters

我有一个数据库表,我正在尝试使用存储过程对其进行更新/插入。让我们像这样定义表:

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 语句中的任何列,除非它们以这种方式显式传递。

最佳答案

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

关于sql - 存储过程 NULL 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5198657/

相关文章:

java - Spring Rest Post 服务发送 null 值作为变量

python - 当 BEGIN 在自动提交模式下的连接上运行时,Postgres 会做什么?

sql - 什么是存储过程?

java - 检查字符串是否为空或空时有时为空,有时不为空

其他方法中的Delphi nil对象

sql - ORA-08103 在过程中使用全局临时表 DML(插入、更新、选择),选择光标到临时表显示错误对象不存在

mysql - 对假的 MySQL 数据库 "namespacing"使用句号是否安全?

sql - sql连续几天

mysql - 查询列出一家商店的顾客,有两个不同的订单表

mysql - 如何在MYSQL中使用Like语句?