間歇此存儲過程將返回一個ID,它是數以百萬計的時候它實際上應該只有大約400爲什麼此存儲過程不會返回正確的ID?
set ANSI_NULLS OFF
set QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestStoredProcedure]
(
@Title VARCHAR(50),
@ID INT OUTPUT
)
AS
DECLARE @ResultsTable Table(InsertedID INT);
INSERT INTO Table
(
Title
)
OUTPUT INSERTED.ID INTO @ResultsTable
VALUES
(
@Title
);
SELECT @ID = (SELECT TOP 1 InsertedID FROM @ResultsTable);
用於通過使用SCOPE_IDENTITY()返回的ID此存儲過程但有同樣的問題。
數據庫中沒有觸發器。只有SQL Server自動創建的主鍵上的索引。沒有任何一張桌子上的身份證號碼與接收的身份證號碼差不多,所以我不知道這些大數字是從哪裏來的。
任何幫助或建議,將不勝感激。
編輯: 正如我前面所說,最初使用這個存儲過程SCOPE_IDENTITY()像這樣:
set ANSI_NULLS OFF
set QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestStoredProcedure]
(
@Title VARCHAR(50),
@ID INT OUTPUT
)
AS
INSERT INTO Table
(
Title
)
VALUES
(
@Title
);
SELECT @ID = SCOPE_IDENTITY();
編輯2:
確切的SQL版本是:
的Microsoft SQL Server 2005 - 9.00.4230.00(X64)Jul 30 2009 13:42:21 Copyright(c)1988-2005 Windows NT 5.2(Build 3790:Service Pack 2)上的Microsoft Corporation標準版(64位)
編輯3:
這是怎樣的存儲過程調用(歷久彌新的經典ASP,它是一個傳統的網站)
set obj_CMD = Server.CreateObject("ADODB.Command")
with obj_CMD
.ActiveConnection = Application("DSN")
.CommandText = "TestStoredProcedure"
.CommandType = adCmdStoredProc
dim txt_title
txt_title = "Some text"
set oParam = .CreateParameter("@Title",adVarChar,adParamInput,50,txt_title)
.Parameters.Append oParam
set oParam = .CreateParameter("@ID",adInteger,adParamOutput)
.Parameters.Append oParam
.Execute
dim ID
ID = .Parameters("@ID").Value
end with
set obj_CMD = nothing
編輯4:
運行DBCC CHECKIDENT( '表' )返回:
檢查身份信息:當前身份值'422',當前列值'422'。 DBCC執行完成。如果DBCC打印錯誤消息,請聯繫您的系統管理員。
這是預期的。
我從來沒有成爲'頂尖1'的粉絲。如果你使用max(InertedID),你會得到同樣的問題嗎? – 2010-08-06 14:33:02
很確定'@ ResultsTable'是矯枉過正的 - 應該能夠在OUTPUT子句中設置'@ID' – 2010-08-06 14:33:41
在表中,您是否有插入時發生的時間戳?如果是這樣,你可以選擇TOP 1 AutoGeneratedID從表ORDER BY timestampcolumn DESC – mpenrow 2010-08-06 14:40:59