Как я могу не отправлять Null в базу данных при использовании Update

Если мне нужно просто обновить один столбец, мне нужно указать предыдущее значение другого столбца, или я могу просто указать столбец, который мне нужно изменить, а не нулевые значения для обновления в базе данных.. вот код процедуры, что я могу сделать с этой процедурой так что мне просто нужно вставить значение, которое я хочу обновить...

 ALTER procedure [dbo].[Customer_update] 
( @Id int,
@Firstname nvarchar(40)=,
@Lastname nvarchar(40)=,
@City nvarchar(40)=null,
@Country nvarchar(40)=null,
@Phone nvarchar(20)=null

)
as 
begin 
update Customer set FirstName=@Firstname,LastName=@Lastname,City=@City,Country=@Country,Phone=@Phone where Id=@Id 
end 

Если вы спрашиваете, как сохранить существующее значение, если один из параметров равен нулю, то - set FirstName=isnull(@Firstname, FirstName), ...

Alex K. 05.04.2019 18:29

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

Panerusamrat 05.04.2019 18:34

В строке, которую я разместил, написано make firstname the value of @Firstname unless @Firstname is null in which case use the current value - это лучший способ сделать это без множества IF/ELSE.

Alex K. 05.04.2019 18:37

@ AlexK. Я не понял, можете ли вы отредактировать мою процедуру и объяснить ....

Panerusamrat 05.04.2019 18:42

Если я правильно вас понимаю, вам не нужно обновлять все столбцы. Вы можете обновить только те столбцы, которые хотите, и удалить те, которые вы не обновляете.

simplycoding 05.04.2019 18:43

@simplycoding, но как я не понимаю вас в этой процедуре, мне нужно передать каждому параметру значение, поэтому

Panerusamrat 05.04.2019 18:50
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
286
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно будет использовать ISNULL для каждого столбца:

ALTER procedure [dbo].[Customer_update] 
( @Id int,
@Firstname nvarchar(40)=,
@Lastname nvarchar(40)=,
@City nvarchar(40)=null,
@Country nvarchar(40)=null,
@Phone nvarchar(20)=null

)
as 
begin 
update Customer 
set FirstName=ISNULL(@Firstname,FirstName),
LastName=ISNULL(@Lastname,LastName),
City=ISNULL(@City,City),
Country=ISNULL(@Country,Country),
Phone=ISNULL(@Phone,Phone)
where Id=@Id 
end 
Ответ принят как подходящий

У вас почти есть это, и, как указал Алекс К. в комментарии выше, самый элегантный способ обработки необязательных обновлений — разрешить нулевые параметры и обновить то, что отправлено.

ALTER PROCEDURE [dbo].[Customer_update] 
    (@Id INT,
     @Firstname NVARCHAR(40) = NULL,
     @Lastname NVARCHAR(40) = NULL,
     @City NVARCHAR(40) = NULL,
     @Country NVARCHAR(40) = NULL,
     @Phone NVARCHAR(20) = NULL)
AS
BEGIN
    UPDATE Customer 
    SET FirstName = ISNULL(@Firstname, FirstName)... 
    WHERE Id = @Id 
END

Чтобы использовать это в клиентском коде с полями, допускающими значение NULL, просто опустите параметр или пропустите значения NULL (одно предостережение: когда вам действительно нужно установить для поля значение NULL, и в этом случае поле, вероятно, не должно иметь значение NULL. Тогда вы можете неявно отправить нулевое значение, и для поля будет установлено правильное значение)

Поля, допускающие значение NULL, позволяют опускать параметры в вызове хранимой процедуры и при этом выполнять операцию. Это полезно, когда вам нужно внести изменения и вы не хотите влиять на существующие приложения, если поля, допускающие значение NULL, не требуются.

Вы спрашиваете о вставке/обновлении за одну операцию?

Некоторые люди делают «апсерты». Мне лично не нравится иметь одну операцию для вставки/обновления. Я чувствую, что клиент уже должен знать, какую операцию следует выполнить, а наличие одной процедуры обновления и одной процедуры вставки делает процедуры более прозрачными и их легче автоматически генерировать.

Однако, если это то, о чем вы спрашивали, вы должны создать процедуру, аналогичную приведенной ниже:

ALTER PROCEDURE [dbo].[Customer_update] 
    (@Id INT = NULL,
     @Firstname NVARCHAR(40) = NULL,
     @Lastname NVARCHAR(40) = NULL
     @City NVARCHAR(40) = NULL
     @Country NVARCHAR(40) = NULL
     @Phone NVARCHAR(20) = NULL)
AS
BEGIN
    IF (@Id IS NULL) 
    BEGIN
        INSERT INTO Customer...
        SET @ID = @@SCOPE_IDENTITY
    END 
    ELSE BEGIN
        UPDATE Customer 
        SET FirtName = ISNULL(@FirstName, FirstName)
        WHERE Id = @Id
    END

    SELECT * 
    FROM Customer 
    WHERE Id = @Id
END

Другие вопросы по теме