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