1. 程式人生 > >SQL Server返回插入資料的ID和受影響的行數

SQL Server返回插入資料的ID和受影響的行數

首先看看資料庫裡面的資料(S_Id為自增長標識列):

sql server 中返回上一次插入資料的ID(標識值)有三種方式:

第一種 @@IDENTITY:

1 insert into Student(S_StuNo,S_Name,S_Sex,S_Height)
2 values('013','衛莊','男','185');
3 
4 select @@IDENTITY        -- 返回 17 

@@IDENTITY可以返回當前連線所有範圍內插入最後所生成的標識值(包括任何呼叫的儲存過程和觸發器)。這個函式不只是可以適用於表。函式返回的值是最後表插入行生成的標識值。比如,現在有一個a表和一個b表,a表插入一條資料並觸發 trigger (觸發器)為b表插入一條資料,這時@@IDENTITY返回的其實是b表的標識列的值,因為@@IDENTITY它總是獲取最後一條變更資料的自增欄位的值。@@IDENTITY 返回為當前會話的所有作用域中的任何表最後生成的標識值。

第二種 IDENT_CURRENT:

1 insert into Student(S_StuNo,S_Name,S_Sex,S_Height)
2 values('014','大司命','女','183');
3 
4 select IDENT_CURRENT('Student')        --返回 18

IDENT_CURRENT()是一個函式,它有一個引數,它的引數就是指定要返回的標識列的值的表名。

IDENT_CURRENT()返回為任何會話和任何作用域中的特定表最後生成的標識值, 不受作用域和會話的限制,而受限於指定的表。

第三種 SCOPE_IDENTITY:

1 insert into Student(S_StuNo,S_Name,S_Sex,S_Height)
2 values('015','月兒','女','165');
3 
4 select SCOPE_IDENTITY()        --返回 19

SCOPE_IDENTITY()返回為當前會話和當前作用域中的任何表最後生成的標識值。一個作用域就是一個模組——儲存過程、觸發器、函式或批處理。

 

IDENT_INCR 用法:

1 -- IDENTITY(1,1) 第一個引數是表示,自增長的起始值,第二個引數表示自增長的增長量,即一次增長多少
2 SELECT IDENT_INCR('Student')    -- 返回 1 

SELECT IDENT_INCR('TableName'),一個引數,'TableName' 表示指定表的表名或檢視名。

返回指定表的標識欄位的增量值(就是自增值,每插入一條新數值序列增加的數值)。

 

IDENT_SEED 用法:

1 -- IDENTITY(1,1) 第一個引數是表示,自增長的起始值,第二個引數表示自增長的增長量,即一次增長多少
2 select IDENT_SEED('Student')    --返回 1

select IDENT_SEED('TableName'),一個引數,'TableName' 表示指定表的表名或檢視名。

返回指定表的標識欄位的種子值(即起始值,指定標識列從哪個數值開始)。

 

sql 獲取標識遞增的下一個值:

1 --獲取當前標識遞增的下一個值,即當前標識最大的值的下一個值
2 select IDENT_CURRENT('Student') + IDENT_INCR('Student')

 

sql 返回受上一語句影響的行數:

@@ROWCOUNT 返回受影響的行數(insert、select、delete、update):

1 select * from Student where S_Sex='女'
2 
3 select @@ROWCOUNT    -- 返回 6

如果行數大於 20 億,請使用 ROWCOUNT_BIG()。

1 select * from Student where S_Sex='男';
2 
3 select ROWCOUNT_BIG()    --返回 9

rowcount 用法:

rowcount的作用就是用來限定後面的sql在返回指定的行數之後便停止處理,例如下面的示例:

複製程式碼
1 -- 查詢出前 5 條資料  
2 set rowcount 5
3 select * from Student where S_Sex='男';
4 
5 -- 查詢出後 5 條資料
6 set rowcount 5
7 select * from Student where S_Sex='男' order by S_Id desc;
複製程式碼

也就是說在查詢上面 rowcount 有著 top [number] 同樣的效果。

要取消set rowcount的限定,只要設定 set rowcount 0 就可以了。

 

注意:set rowcount的限定對修改,刪除一樣有效。比如下面的示例:

1 set rowcount 3
2 update Student set S_BirthDate='2017-01-01'
3 where S_Id<20
4 
5 select @@ROWCOUNT    --返回 3 
複製程式碼
1 set rowcount 5
2 delete from Student where S_BirthDate is null
3 
4 select @@ROWCOUNT    --返回 5
5 
6 set rowcount 0
7 
8 select * from Student
複製程式碼