我有一个有列的Users
表ImgPath
。我希望该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
语句。