從 INSERT 返回 IDENTITY 如何在執行 SQL INSERT 后檢索 IDENTITY 值。通常,問題不在於如何編寫檢索值的查詢,而在於在哪里以及何時進行檢索。在 SQL Server 中,下面的語句可用於檢索由最新在活動數據庫連接上運行的 SQL 語句所創建的 IDENTITY 值: SELECT @@IDENTI
從 INSERT 返回 IDENTITY
如何在執行 SQL INSERT 后檢索 IDENTITY 值。通常,問題不在於如何編寫檢索值的查詢,而在於在哪里以及何時進行檢索。在 SQL Server 中,下面的語句可用於檢索由最新在活動數據庫連接上運行的 SQL 語句所創建的 IDENTITY 值:
SELECT @@IDENTITY
這個 SQL 語句並不復雜,但需要記住的一點是:如果這個最新的 SQL 語句不是 INSERT,或者您針對非 INSERT SQL 的其他連接運行了此 SQL,則不會獲得期望的值。您必須運行下列代碼才能檢索緊跟在 INSERT SQL 之后且位於同一連接上的 IDENTITY,如下所示:
INSERT INTO Products (ProductName) VALUES ('Chalk')
SELECT @@IDENTITY
在一個連接上針對 Northwind 數據庫運行這些查詢將返回一個名稱為 Chalk 的新產品的 IDENTITY 值。所以,在使用 ADO 的 Visual Basic? 應用程序中,可以運行以下語句:
Set oRs = oCn.Execute("SET NOCOUNT ON;INSERT INTO Products _
(ProductName) VALUES ('Chalk');SELECT @@IDENTITY")
lProductID = oRs(0)
此代碼告訴 SQL Server 不要返回查詢的行計數,然后執行 INSERT 語句,並返回剛剛為這個新行創建的 IDENTITY 值。SET NOCOUNT ON 語句表示返回的記錄集有一行和一列,其中包含了這個新的 IDENTITY 值。如果沒有此語句,則會首先返回一個空的記錄集(因為 INSERT 語句不返回任何數據),然后會返回第二個記錄集,第二個記錄集中包含 IDENTITY 值。這可能有些令人困惑,尤其是因為您從來就沒有希望過 INSERT 會返回記錄集。之所以會發生此情況,是因為 SQL Server 看到了這個行計數(即一行受到影響)並將其解釋為表示一個記錄集。因此,真正的數據被推回到了第二個記錄集。當然您可以使用 ADO 中的 NextRecordset 方法獲取此第二個記錄集,但如果總能夠首先返回該記錄集且只返回該記錄集,則會更方便,也更有效率。
此方法雖然有效,但需要在 SQL 語句中額外添加一些代碼。獲得相同結果的另一方法是在 INSERT 之前使用 SET NOCOUNT ON 語句,並將 SELECT @@IDENTITY 語句放在表中的 FOR INSERT 觸發器中,如下面的代碼片段所示。這樣,任何進入該表的 INSERT 語句都將自動返回 IDENTITY 值。
CREATE TRIGGER trProducts_Insert ON Products FOR INSERT AS
SELECT @@IDENTITY
GO
觸發器只在 Products 表上發生 INSERT 時啟動,所以它總是會在成功 INSERT 之后返回一個 IDENTITY。使用此技術,您可以
如何在執行 SQL INSERT 后檢索 IDENTITY 值。通常,問題不在於如何編寫檢索值的查詢,而在於在哪里以及何時進行檢索。在 SQL Server 中,下面的語句可用於檢索由最新在活動數據庫連接上運行的 SQL 語句所創建的 IDENTITY 值:
SELECT @@IDENTITY
這個 SQL 語句並不復雜,但需要記住的一點是:如果這個最新的 SQL 語句不是 INSERT,或者您針對非 INSERT SQL 的其他連接運行了此 SQL,則不會獲得期望的值。您必須運行下列代碼才能檢索緊跟在 INSERT SQL 之后且位於同一連接上的 IDENTITY,如下所示:
INSERT INTO Products (ProductName) VALUES ('Chalk')
SELECT @@IDENTITY
在一個連接上針對 Northwind 數據庫運行這些查詢將返回一個名稱為 Chalk 的新產品的 IDENTITY 值。所以,在使用 ADO 的 Visual Basic? 應用程序中,可以運行以下語句:
Set oRs = oCn.Execute("SET NOCOUNT ON;INSERT INTO Products _
(ProductName) VALUES ('Chalk');SELECT @@IDENTITY")
lProductID = oRs(0)
此代碼告訴 SQL Server 不要返回查詢的行計數,然后執行 INSERT 語句,並返回剛剛為這個新行創建的 IDENTITY 值。SET NOCOUNT ON 語句表示返回的記錄集有一行和一列,其中包含了這個新的 IDENTITY 值。如果沒有此語句,則會首先返回一個空的記錄集(因為 INSERT 語句不返回任何數據),然后會返回第二個記錄集,第二個記錄集中包含 IDENTITY 值。這可能有些令人困惑,尤其是因為您從來就沒有希望過 INSERT 會返回記錄集。之所以會發生此情況,是因為 SQL Server 看到了這個行計數(即一行受到影響)並將其解釋為表示一個記錄集。因此,真正的數據被推回到了第二個記錄集。當然您可以使用 ADO 中的 NextRecordset 方法獲取此第二個記錄集,但如果總能夠首先返回該記錄集且只返回該記錄集,則會更方便,也更有效率。
此方法雖然有效,但需要在 SQL 語句中額外添加一些代碼。獲得相同結果的另一方法是在 INSERT 之前使用 SET NOCOUNT ON 語句,並將 SELECT @@IDENTITY 語句放在表中的 FOR INSERT 觸發器中,如下面的代碼片段所示。這樣,任何進入該表的 INSERT 語句都將自動返回 IDENTITY 值。
CREATE TRIGGER trProducts_Insert ON Products FOR INSERT AS
SELECT @@IDENTITY
GO
觸發器只在 Products 表上發生 INSERT 時啟動,所以它總是會在成功 INSERT 之后返回一個 IDENTITY。使用此技術,您可以