Как я не могу отправить Null в базу данных при использовании обновления - PullRequest
0 голосов
/ 05 апреля 2019

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

 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 

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

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

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

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

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

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

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

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

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
0 голосов
/ 05 апреля 2019

Вам потребуется использовать 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...