[MSSQL]取得剛新增資料的自動編號

[MSSQL]取得剛新增資料的自動編號

在資料庫中,我們常常會使用自動編號來當資料的索引碼,
當然也可能需要在新增完資料後立即抓取剛剛新增的自動編號是多少.

而在MSSQL中,
要取得這資料的話,
你可以使用下面的語法來取得

-- 新增資料
insert into tbTableName (fld1,fld2)
values(@fld1,@fld2)
-- 傳回剛新增的自動編號資料
select scope_identity()

之前我都是使用
select @@identity
來取的自動編號的資料.

而這兩者之間的差異在於
"SCOPE_IDENTITY 和 @@IDENTITY 將傳回現行工作階段中任何資料表所產生的最後一個識別值,不過,SCOPE_IDENTITY 只會傳回現行範圍內的值,@@IDENTITY 並未限制特定範圍。"
上面這段是取自"Transact-SQL 程式語法的參考說明",
不過這樣說,可能還是不太懂他的差異...

所以直接看下面的範例應該就可以了解的...

範例
本範例可建立兩個資料表:TZ 和 TY,以及 TZ 上的 INSERT 觸發程序。在資料表 TZ 插入資料列時,即引發觸發程序 (Ztrig) 並於 TY 插入一資料列。

USE tempdb
GO
CREATE TABLE TZ (
Z_id int IDENTITY(1,1)PRIMARY KEY,
Z_name varchar(20) NOT NULL)

INSERT TZ
VALUES ('Lisa')
INSERT TZ
VALUES ('Mike')
INSERT TZ
VALUES ('Carla')

SELECT * FROM TZ

--Result set: This is how table TZ looks
Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla

CREATE TABLE TY (
Y_id int IDENTITY(100,5)PRIMARY KEY,
Y_name varchar(20) NULL)

INSERT TY (Y_name)
VALUES ('boathouse')
INSERT TY (Y_name)
VALUES ('rocks')
INSERT TY (Y_name)
VALUES ('elevator')

SELECT * FROM TY
--Result set: This is how TY looks:
Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator

/*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END

/*FIRE the trigger and find out what identity values you get
with the @@IDENTITY and SCOPE_IDENTITY functions*/
INSERT TZ VALUES ('Rosalie')

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT @@IDENTITY AS [@@IDENTITY]
GO

--Here is the result set.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/

@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/

@@IDENTITY