2021/05/19

[SQL] INSERTED

最近開發需求中,須建立一個主鍵為
uniqueidentifier
型別的表,且當新增一筆資料後須將新建資料的主鍵傳回。由於主鍵不再是
IDENTITY
型態的數值,無法使用
SELECT SCOPE_IDENTITY() AS NewID
方式取得,因此直覺改法就是在執行
INSERT
指令前先透過
NEWID()
產生 GUID,最後再將該筆 GUID 字串
SELECT
回去。


爬了一些網路上的教學後發現:若要將 GUID 作為主鍵,建議使用
NEWSEQUENTIALID()
取代
NEWID()
。不過替換過程是有代價。由於
NEWSEQUENTIALID()
只能使用在
DEFAULT
運算式,無法在預存程序程式碼中產生並指派到參數內,因此若新增資料後要回傳自動透過
NEWSEQUENTIALID()
產生的 GUID 值,需用點小技巧。此時,
INSERTED
指令就派上用場了。


--Table: NewSeqIdDemo

ID                                     FirstName    LastName
-------------------------------------  -----------  -----------
35881e9e-99b8-eb11-80d7-00155d321b03   Felix        Huang
e950efba-99b8-eb11-80d7-00155d321b03   Lanny        Huang

上表中,若執行
INSERT
指令後想取得剛才新增該筆紀錄的特定欄位,可以在
VALUES
的指令前加入
OUTPUT INSERTED.<欄位名稱>
,如:

INSERT INTO NewSeqIdDemo (FirstName, LastName)
OUTPUT INSERTED.FirstName, INSERTED.LastName
VALUES ('Vincent', 'Huang')

這指令很方便,任何欄位值都可以回傳,不過可惜的是無法一一將各欄位取出的值塞進已宣告的參數內。若現在想將 ID 塞進某個已宣告的參數內,方法很簡單,只需要將取出來的欄位值塞進一個資料表內,再透過
SELECT
指令,就可以輕鬆取得並賦值到指定的參數了。

DECLARE @ID AS UNIQUEIDENTIFIER
--宣告一個承接 INSERTED 取出值的臨時資料表
DECLARE @table TABLE (ID UNIQUEIDENTIFIER)

INSERT INTO NewSeqIdDemo (FirstName, LastName)
OUTPUT INSERTED.ID INTO @table
VALUES ('Vincent', 'Huang')

SELECT @ID = ID FROM @table




參考來源:

  1. NEWSEQUENTIALID (Transact-SQL)
  2. Return the uniqueidentifier generated by a default on insert
  3. SQL 下完 Insert Into 之後,取得剛剛 Insert 的欄位值 (指定返回欄位)

沒有留言 :

張貼留言

注意:只有此網誌的成員可以留言。