簡體   English   中英

在存儲過程中一起使用@@ IDENTITY或SCOPE_IDENTITY()+插入

[英]Using @@IDENTITY or SCOPE_IDENTITY() + Insert, together in Stored Procedures

代碼是這樣的

   INSERT INTO TABLE (VAL1,VAL2,VAL3) VALUES (X,Y,Z)

   GetLastInsertID @tablename='TABLE'

GetLastInsertID是此存儲過程:

   SELECT @@IDENTITY AS LastID FROM TABLE

如何獲得存儲過程以按照上面的Select @@ IDENTITY語句的要求返回“ LastID”?

我收到以下錯誤:

   Incorrect syntax near 'GetLastInsertId'.

...但這在單獨執行時效果很好:

   GetLastInsertID @tablename='TABLE'

好的,謝謝我將其更新為Scope_Identity()。 但是您是說不要將其放在不同的SP中,而不要將其放在與Insert相同的SP中?

再次,當我與此插入結合時,我仍然得到一個錯誤:

   SELECT SCOPE_IDENTITY() AS LastID FROM TABLE

這是新的錯誤消息:

   There is already an object named 'TABLE' in the database.

將其完全拆分為存儲過程是一個壞主意,因為存儲過程會創建新的作用域/上下文。 這樣您就可以抓住錯誤的ID號。 如果會話中的一個用戶將許多行一起插入,則可能會得到錯誤的結果。

相反,您幾乎總是需要scope_identity()函數,並且要在與創建新記錄的語句相同的上下文中調用它。

首先,您永遠不想使用@@ identity,因為如果有人添加觸發器,它可能會中斷。

您要使用的是OUTPUT子句或scope_identity。 有關如何使用輸出的示例,請參見在線書籍。

您的錯誤是您未能包含EXECUTE命令,請嘗試以下操作:

INSERT INTO TABLE (VAL1,VAL2,VAL3) VALUES (X,Y,Z)

EXEC GetLastInsertID @tablename='TABLE'

EXEC當您嘗試運行沒有其他命令的程序,但是當你包括假設INSERT它使EXEC要求。

現在,您真的需要確定您要嘗試做的是一個好的設計。

嘗試這個:

DECLARE @LastId int
INSERT INTO TABLE (VAL1,VAL2,VAL3) VALUES (X,Y,Z)
SELECT @LastID=SCOPE_IDENTITY()

這是執行此操作的示例代碼。 (但是存儲的過程不會增加任何值。)

--First create a test table.
    create table test
    (id int identity,
    name varchar(30))
    go

--A stored proc that returns the scope_identity()  
    create proc dbo.spTest
    as

    insert into test(name)
    values ('test')

    return scope_identity()

    go


-- Sample call
    declare @newId int

    exec @newId = spTest

    print @newId

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM