laravel sql語法




獲取新的SQL記錄ID (6)

我怎樣才能找到我剛插入的新記錄的自動生成的ID? (使用ASP經典和MSSQL 2005)


SELECT @@ IDENTITY通常起作用,但是可以返回由於觸發器或某事而插入的記錄的身份,而不是原始的。

SELECT SCOPE_IDENTITY是我推薦的。 它返回僅在當前範圍內插入的值。

還有一個“IDENT_CURRENT(表名)”,它返回為特定表插入的最後一個標識。


SELECT @@ Identity或SELECT SCOPE_IDENTITY()都可以使用,但是選擇SCOPE_Identity()更安全,因為它會返回當前作用域內最後一個自動生成的ID。 例如,假設我們有一個名為ScopeIDTable的表,在這個表上我們有一個觸發器。 這個觸發器會將一個記錄插入到TriggerIdTable中,兩個表都有一個自動增量列。

如果使用SELECT @@ Identity,則會在該會話中獲取最後一個自動增量,該自動增量將是從觸發器(TriggerIdTable)中生成的Id。

如果您使用SELECT SCOPE_IDENTITY(),您將從您的ScopeIdTable中獲得該ID。


在需要以集合方式一次插入多個記錄的情況下,它可以變得更有趣。

我有時會使用客戶端生成的GUID(但對於傳統的ASP,您可能需要使用實用程序來生成值),或者更常見的是服務器端的GUID鍵列上的NEWSQUENTIALID()約束。

我知道不是每個人都喜歡GIUDS,但是有一些非常有用的原因(它們的大小以及它如何影響索引/分頁)。

http://www.sqlmag.com/Articles/Index.cfm?ArticleID=50164&pg=2


您運行查詢

select scope_identity()

使用相同的數據庫連接,在做任何事情之前。 結果就像你所期望的那樣,一個包含一個單一行的記錄集只有一個字段。 您可以使用索引0訪問該字段,或者如果您願意,可以給它一個名稱:

select scope_identity() as lastId

我總是想知道為什麼要使用

@@identity

以來

select scope_identity() 

顯然是完成蘇格蘭人所要求的最省錢的方式。


SELECT SCOPE_IDENTITY() 

使用@@ IDENTITY可能會有意想不到的結果,所以要小心如何使用該結果。 將記錄插入到其他表的觸發器將導致@@ IDENTITY值發生更改 - 其中,SCOPE_IDENTITY()將僅為您提供當前範圍的最後一個標識。

下面是一個示例,它將顯示@@ IDENTITY和SCOPE_INSERT()之間的區別,以及它們如何返回不同的值。

use tempdb
go
create table table1
    (ID int identity)
go
create table table2
    (ID int identity(100, 1))
go
create trigger temptrig 
    on table1 
    for insert
as
begin

    insert  table2 
     default values;

end
go
insert  table1 
default values;
select  SCOPE_IDENTITY(), 
        @@IDENTITY

另一個沒有人討論過的選項是使用SQL 2005中的OUTPUT子句。在這種情況下,只需要將輸出子句添加到插入,然後從代碼中捕獲該記錄集。 這插入多個記錄,而不是只有1時,效果很好...

use tempdb
go
create table table1
    (ID int identity)
go
insert   table1 
output   inserted.ID
default values;
--OR...
insert   table1 
output   inserted.$identity
default values;




asp-classic