Sql-Server

插入和更新的單獨儲存過程?

  • May 15, 2020

我在 Microsoft SQL Server 中有一個表。有時我需要更新,有時我需要插入。我可以寫2個儲存過程:

InsertNewPerson
UpdatePertsonById

但我正在考慮編寫 1 個儲存過程,而不是 ( SetPerson),這兩者都可以(如果有ID,它是一個update操作,否則insert)。

我應該創建一個儲存過程(只維護一個)還是應該創建兩個不同的儲存過程?

據我了解,您實際上並不是在談論UPSERT這裡只是在一個儲存過程中組合兩個不同的 CRUD 操作。

CREATE PROC InsertOrUpdateYourTable @Id int = NULL OUTPUT,
                                   @Foo INT,
                                   @Bar VARCHAR(10)
AS
   IF @Id IS NULL
     BEGIN
         INSERT INTO YourTable
                     (Foo,
                      Bar)
         VALUES      (@Foo,
                      @Bar)

         SET @Id = SCOPE_IDENTITY()
     END
   ELSE
     BEGIN
         UPDATE YourTable
         SET    Foo = @Foo,
                Bar = @Bar
         WHERE  Id = @Id
     END 

我看到的好處是,如果表結構發生變化,您不必維護兩個單獨的參數列表。缺點是單個儲存過程現在有兩個職責,不太容易理解。

我通常會選擇將它們分成兩個儲存過程。

RE:“你能詳細說明一下 upsert 的外觀嗎?”

CREATE PROC UpsertYourTable
@Id int,
@Foo int,
@Bar varchar(10)
AS
MERGE YourTable WITH (HOLDLOCK)  AS T
       USING ( VALUES ( @Id, @Foo, @Bar ) ) 
             AS source ( Id, Foo, Bar)
       ON ( T.Id = source.Id )
       WHEN MATCHED 
           THEN 
       UPDATE SET
               Foo = source.Foo ,
               Bar = source.Bar
       WHEN NOT MATCHED 
           THEN    
       INSERT  (Id, Foo , Bar)
              VALUES 
              (@Id, @Foo , @Bar);

這假定它Id不再是一IDENTITY列。HOLDLOCK 這裡解釋了使用的原因。

引用自:https://dba.stackexchange.com/questions/29755