我有一个数据库表我试图用存储过程进行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语句中的任何列,除非它们以这种方式显式传递。
答案 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)