У меня есть SP как так (использующий SQL Server):
ALTER PROCEDURE [dbo].[sp_ClientNotes_update]
@id uniqueidentifier,
@ordering smallint = NULL,
@title nvarchar(20) = NULL,
@content text = NULL
AS
BEGIN
SET NOCOUNT ON;
UPDATE tbl_ClientNotes
SET ordering=@ordering, title=@title, content=@content
WHERE id=@id
END
Я хотел бы только установить значения, если они передаются в SP, т.е. не ПУСТЫЕ. Это может быть сделано?
Этот вопрос, кажется, предполагает, что единственный путь использует абсолютно отдельные запросы с условными выражениями, но для 3 дополнительных параметров это, очевидно, было бы кошмаром!
Попробуйте это.
ALTER PROCEDURE [dbo].[sp_ClientNotes_update]
@id uniqueidentifier,
@ordering smallint = NULL,
@title nvarchar(20) = NULL,
@content text = NULL
AS
BEGIN
SET NOCOUNT ON;
UPDATE tbl_ClientNotes
SET ordering=ISNULL(@ordering,ordering),
title=ISNULL(@title,title),
content=ISNULL(@content, content)
WHERE id=@id
END
Также, возможно, стоит добавить дополнительную часть в предложение WHERE
, если вы используете репликацию транзакций, тогда оно отправит подписчику еще одно обновление, если все они равны NULL, чтобы предотвратить это.
WHERE id=@id AND (@ordering IS NOT NULL OR
@title IS NOT NULL OR
@content IS NOT NULL)
UPDATE tbl_ClientNotes
SET
ordering=ISNULL@ordering,ordering),
title=isnull(@title,title),
content=isnull(@content,content)
WHERE id=@id
Я помню, что видел раньше, если вы обновляетесь до то же значение SQL Server фактически распознает это и не будет выполнять ненужную запись.
Одна идея:
UPDATE tbl_ClientNotes
SET ordering=ISNULL(@ordering, ordering), title=ISNULL(@title, title), content=ISNULL(@content, content)
WHERE id=@id
UPDATE tbl_ClientNotes
SET ordering=@ordering, title=@title, content=@content
WHERE id=@id
AND @ordering IS NOT NULL
AND @title IS NOT NULL
AND @content IS NOT NULL
Или, если вы имели в виду, что хотите обновить только отдельные столбцы, вы бы использовали сообщение выше моего. Я прочитал, что не обновлять, если какие-либо значения равны нулю