Sql-Server
插入和更新的單獨儲存過程?
我在 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
這裡解釋了使用的原因。