Вставить и обновить несколько записей с помощью одной хранимой процедуры - PullRequest
1 голос
/ 01 апреля 2019

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

Если идентификатор отсутствует в таблице, вставьте запись. Это хранимая процедура компилируется нормально, но, похоже, не работает должным образом. Нужен ли цикл while?

ALTER PROCEDURE [dbo].[SMLineUpdate]
(
  @id [int],
  @Payroll_Id [int],
  @ProductCode nvarchar(255),
  @Description nvarchar (255),
  @Qty nvarchar(255)
)
AS
IF EXISTS (SELECT Id from Smline where @id = Id) BEGIN 
  update dbo.SmLine
    Set [Payroll_Id] = @Payroll_Id
    , ProductCode = @ProductCode
    , Description = @Description
    , Qty = @Qty
END ELSE BEGIN 
  INSERT INTO SmLine ([Payroll_Id], [ProductCode], [Description], [Qty])
    VALUES (@Payroll_Id, @ProductCode, @Description, @Qty)
END

Ответы [ 4 ]

0 голосов
/ 01 апреля 2019

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

0 голосов
/ 01 апреля 2019
IF EXISTS(SELECT Id from Smline where Id =@id)
BEGIN 
update dbo.SmLine
Set [Payroll_Id]= @Payroll_Id
,ProductCode= @ProductCode
,Description = @Description
,Qty = @Qty
WHERE  Id = @Id  
END
ELSE
BEGIN 
INSERT INTO SmLine ([Payroll_Id],[ProductCode],[Description],[Qty])
VALUES (@Payroll_Id,@ProductCode ,@Description,@Qty)
END   
0 голосов
/ 01 апреля 2019

В вашем утверждении об обновлении отсутствует оператор where. Это главное «нет-нет», так как оно (не дай бог ...) обновит все строки в таблице.

В вашем операторе вставки отсутствует вставка идентификатора, поэтому рассмотрим случай, когда вы пытаетесь обновить / вставить id = 5, но теперь эта строка удалена (не найдена в where), и идентификаторы намного больше. вы бы искали его -> не нашли и вставили новую строку (скажем, id = 101), затем снова искали id = 5, не нашли его снова и вставили снова (скажем, id = 102) и т. д. ... Я не думаю, что это то, что вы хотели. Рассмотрим оператор слияния (когда сопоставлено / когда не сопоставлено) и получим лучшее из обоих миров. Также не стоит удалять из таблицы, а вместо этого добавьте столбец IsDeleted (который позволяет «оживить» удаленную строку).

0 голосов
/ 01 апреля 2019

В вашем update запросе отсутствует условие where

update dbo.SmLine
Set    [Payroll_Id] = @Payroll_Id
      ,ProductCode  = @ProductCode
      ,Description  = @Description
      ,Qty = @Qty
WHERE  Id = @Id      -- the query missed this where condition
...