Используя ОБНОВЛЕНИЕ в хранимой процедуре с дополнительными параметрами

У меня есть 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 дополнительных параметров это, очевидно, было бы кошмаром!

23
задан Community 23 May 2017 в 12:02
поделиться

4 ответа

Попробуйте это.

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)
41
ответ дан 29 November 2019 в 01:43
поделиться
   UPDATE tbl_ClientNotes
    SET 
      ordering=ISNULL@ordering,ordering), 
      title=isnull(@title,title), 
      content=isnull(@content,content)
    WHERE id=@id

Я помню, что видел раньше, если вы обновляетесь до то же значение SQL Server фактически распознает это и не будет выполнять ненужную запись.

3
ответ дан 29 November 2019 в 01:43
поделиться

Одна идея:

UPDATE tbl_ClientNotes
SET ordering=ISNULL(@ordering, ordering), title=ISNULL(@title, title),  content=ISNULL(@content, content)
WHERE id=@id
3
ответ дан 29 November 2019 в 01:43
поделиться
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

Или, если вы имели в виду, что хотите обновить только отдельные столбцы, вы бы использовали сообщение выше моего. Я прочитал, что не обновлять, если какие-либо значения равны нулю

0
ответ дан 29 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: