Хранимая процедура с параметром, который по умолчанию имеет значение ограничения по умолчанию - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть таблица 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 оператора.

1 Ответ

0 голосов
/ 18 апреля 2019

Не так, как ферма с 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 имеет значение.

...