Если мне нужно просто обновить один столбец, мне нужно указать предыдущее значение другого столбца, или я могу просто указать столбец, который мне нужно изменить, а не нулевые значения для обновления в базе данных.. вот код процедуры, что я могу сделать с этой процедурой так что мне просто нужно вставить значение, которое я хочу обновить...
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
нет, я имею в виду, если мне нужно обновить один столбец и просто хочу вставить конкретное значение, а другое значение будет сохранено как предыдущее значение в столбце .... например, я хочу обновить имя и фамилию, но другой столбец не нужно быть обновленным, так что я могу сделать, чтобы мне просто нужно было вставить столбец, который я хочу обновить
В строке, которую я разместил, написано make firstname the value of @Firstname unless @Firstname is null in which case use the current value
- это лучший способ сделать это без множества IF/ELSE.
@ AlexK. Я не понял, можете ли вы отредактировать мою процедуру и объяснить ....
Если я правильно вас понимаю, вам не нужно обновлять все столбцы. Вы можете обновить только те столбцы, которые хотите, и удалить те, которые вы не обновляете.
@simplycoding, но как я не понимаю вас в этой процедуре, мне нужно передать каждому параметру значение, поэтому
Вам нужно будет использовать 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
Если вы спрашиваете, как сохранить существующее значение, если один из параметров равен нулю, то -
set FirstName=isnull(@Firstname, FirstName), ...