[英]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.