У меня есть таблица 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 имеет значение NULL, по умолчанию использовалось значение DEFAULT CONSTRAINT, не имеющее значения как в объявлении таблицы, так и в хранимой процедуре?
Если я отправляю NULL или устанавливаю значение по умолчанию @ImgPath
в NULL, это не работает, так как NULL переопределяет значение по умолчанию и, поскольку столбец не имеет значения NULL, он выдает ошибку.
COALESCE
и ISNULL
не любят, когда DEFAULT
является резервным параметром.
Я также хотел бы, чтобы у вас не было противного оператора if / case, выполняющего два MERGE
оператора.