2

我有一个有列的UsersImgPath。我希望该ImgPath列不为空并默认为特定路径。在表声明中,我有这个:

[ImgPath] VARCHAR(256) NOT NULL 
    CONSTRAINT [DF_Users_ImgPath] DEFAULT ('/images/default.jpg')

我有一个SaveUser存储过程,它是一个合并语句,用于使用ImgPath新用户更新用户或使用关联的ImgPath.

CREATE PROCEDURE [dbo].[SaveUser] 
    (@UserId UNIQUEIDENTIFIER, 
     @ImgPath VARCHAR(256)) 
AS
    MERGE [dbo].[Users] AS TARGET
    USING (SELECT @UserId, @ImgPath) AS SOURCE ([UserId], [ImgPath]) ON (TARGET.[UserId] = SOURCE.[UserId])

    WHEN MATCHED THEN
        UPDATE 
            SET TARGET.[ImgPath] = SOURCE.[ImgPath]

    WHEN NOT MATCHED BY TARGET THEN
        INSERT ([UserId], [ImgPath])
        VALUES (SOURCE.[UserId], SOURCE.[ImgPath]);

如何编辑存储过程,以便如果 ImgPath 为空,它默认为 DEFAULT CONSTRAINT 值,而表声明和存储过程中都没有该值?

如果我发送 NULL 或将默认值设置@ImgPath为 NULL,这不起作用,因为 NULL 会覆盖默认值,并且由于列不可为空,因此会引发错误。

COALESCE并且ISNULL不喜欢DEFAULT成为后备参数。

我也不想有一些讨厌的 if/case 语句来执行两个MERGE语句。

4

1 回答 1

0

不像我应该的那样使用 MERGE,但这可能会奏效。

CREATE PROCEDURE [dbo].[SaveUser] 
    (@UserId UNIQUEIDENTIFIER, 
     @ImgPath VARCHAR(256)) 
AS
    MERGE [dbo].[Users] AS TARGET
    USING (SELECT @UserId, @ImgPath) AS SOURCE ([UserId], [ImgPath]) ON (TARGET.[UserId] = SOURCE.[UserId])

    WHEN MATCHED AND SOURCE.[ImgPath] is not null THEN
        UPDATE 
            SET TARGET.[ImgPath] = SOURCE.[ImgPath]


    WHEN NOT MATCHED BY TARGET AND SOURCE.[ImgPath] is not null THEN
        INSERT ([UserId], [ImgPath])
        VALUES (SOURCE.[UserId], SOURCE.[ImgPath])
    WHEN NOT MATCHED BY TARGET AND SOURCE.[ImgPath] IS NULL then
        INSERT ([UserId])
        VALUES (SOURCE.[UserId]);

当 ImgPath 有值时,这应该只摆弄 ImgPath 。

于 2019-04-17T21:04:49.620 回答