SQL語句中@@IDENTITY和@@ROWCOUNT差別
在一條 INSERT、SELECT INTO 或大容量複制語句完成後,@@IDENTITY 中包含語句生成的最後一個辨別值。 如果語句未影響任何包含辨別列的表,則 @@IDENTITY 傳回 NULL。 如果插入了多個行,生成了多個辨別值,則 @@IDENTITY 将傳回最後生成的辨別值。 如果語句觸發了一個或多個觸發器,該觸發器又執行了生成辨別值的插入操作,那麼,在語句執行後立即調用 @@IDENTITY 将傳回觸發器生成的最後一個辨別值。 如果對包含辨別列的表執行插入操作後觸發了觸發器,并且觸發器對另一個沒有辨別列的表執行了插入操作,則 @@IDENTITY 将傳回第一次插入的辨別值。 出現 INSERT 或 SELECT INTO 語句失敗或大容量複制失敗,或者事務被復原的情況時,@@IDENTITY 值不會恢複為以前的設定。
如果語句和事務失敗,它們會更改表的目前辨別,進而使辨別列中的值出現不連貫現象。 即使未送出試圖向表中插入值的事務,也永遠無法復原辨別值。 例如,如果因 IGNORE_DUP_KEY 沖突而導緻 INSERT 語句失敗,表的目前辨別值仍然會增加。
@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 是相似的函數,因為他們都傳回插入到表的 IDENTITY 列的最後一個值。
@@IDENTITY 和 SCOPE_IDENTITY 可以傳回目前會話中的所有表中生成的最後一個辨別值。 但是,SCOPE_IDENTITY 隻在目前作用域内傳回值,而 @@IDENTITY 不限于特定的作用域。
IDENT_CURRENT 不受作用域和會話的限制,而受限于指定的表。 IDENT_CURRENT 可以傳回任何會話和任何作用域中為特定表生成的辨別值。 有關詳細資訊,請參閱 IDENT_CURRENT (Transact-SQL)。
@@IDENTITY 函數的作用域是執行該函數的本地伺服器上的目前會話。 此函數不能應用于遠端或連結伺服器。 若要獲得其他伺服器上的辨別值,請在遠端伺服器或連結伺服器上執行存儲過程,并使(在遠端或連結伺服器的環境中執行的)該存儲過程收集辨別值,并将其傳回本地伺服器上的發出調用的連接配接。
複制可能會影響 @@IDENTITY 值,因為該值在複制觸發器及存儲過程中使用。 如果此列是複制項目的一部分,則 @@IDENTITY 不是最近使用者建立的辨別的可靠訓示器。 您可以使用 SCOPE_IDENTITY() 函數文法代替 @@IDENTITY。 有關詳細資訊,請參閱 SCOPE_IDENTITY (Transact-SQL)。
USE AdventureWorks2012;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO
Transact-SQL 語句可以通過下列方式設定 @@ROWCOUNT 的值:
将 @@ROWCOUNT 設定為受影響或被讀取的行的數目。 可以将行發送到用戶端,也可以不發送。
保留前一個語句執行中的 @@ROWCOUNT。
将 @@ROWCOUNT 重置為 0 但不将該值傳回到用戶端。
執行簡單配置設定的語句始終将 @@ROWCOUNT 值設定為 1。 不将任何行發送到用戶端。 這些語句的示例如下:SET @local_variable、RETURN、READTEXT 以及不帶查詢的 Select 語句,如 SELECT GETDATE() 或 SELECT 'Generic Text'。
在查詢中進行配置設定或使用 RETURN 的語句将 @@ROWCOUNT 值設定為受查詢影響的行數或查詢讀取的行數,例如:SELECT @local_variable = c1 FROM t1。
資料操作語言 (DML) 語句将 @@ROWCOUNT 值設定為受查詢影響的行數,并将該值傳回到用戶端。 DML 語句不會将任何行發送到用戶端。
DECLARE CURSOR 和 FETCH 将 @@ROWCOUNT 值設定為 1。
EXECUTE 語句保留前一個 @@ROWCOUNT。
USE、SET <option>、DEALLOCATE CURSOR、CLOSE CURSOR、BEGIN TRANSACTION 或 COMMIT TRANSACTION 等語句将 ROWCOUNT 值重置為 0。
示例
以下示例執行 UPDATE 語句并使用 @@ROWCOUNT 來檢測是否更改了任何一些行。
USE AdventureWorks2012;
GO
UPDATE HumanResources.Employee
SET JobTitle = N'Executive'
WHERE NationalIDNumber = 123456789
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were updated';
GO
作者:
Tyler Ning出處:
http://www.cnblogs.com/tylerdonet/本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,如有問題,可以通過以下郵箱位址
[email protected]聯系我,非常感謝。