2010-08-06 73 views
3

間歇此存儲過程將返回一個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打印錯誤消息,請聯繫您的系統管理員。

這是預期的。

+0

我從來沒有成爲'頂尖1'的粉絲。如果你使用max(InertedID),你會得到同樣的問題嗎? – 2010-08-06 14:33:02

+0

很確定'@ ResultsTable'是矯枉過正的 - 應該能夠在OUTPUT子句中設置'@ID' – 2010-08-06 14:33:41

+0

在表中,您是否有插入時發生的時間戳?如果是這樣,你可以選擇TOP 1 AutoGeneratedID從表ORDER BY timestampcolumn DESC – mpenrow 2010-08-06 14:40:59

回答

1

我的理解是,直到創建行之後才能確定分配給標識列的值,並且包括嘗試通過OUTPUT子句訪問它。

@@ identity和scope_identity()真的應該工作。你可以使用該代碼發佈你的樣本嗎? (我注意到:當我說「我的理解是...」時,我的意思是我已經在幾個版本的SQL Server上研究了這個很多,我從來沒有找到方法要做到這一點,而且我似乎還記得多年來看過幾篇文章和文章,說它不能完成,但嘿,我真的很想錯,所以我會看這篇文章。)

+1

您可以使用OUTPUT子句訪問新的IDENTITY值。但是,是的,SCOPE_IDENTITY()應該完成這項工作。 – AdaTheDev 2010-08-06 14:44:50

+0

我從來沒有使用這種方法返回身份的問題 - 「OUTPUT」子句中的「插入」表反映插入的行,就像在觸發器中一樣 - 請參閱MS文檔 - http://msdn.microsoft.com/ EN-US /庫/ ms177564.aspx。 – 2010-08-06 14:48:02

+0

我知道,當2005年第一次出來時,我讀的地方輸出參數沒有捕獲身份列。也許我讀錯了,也許他們寫錯了,也許他們已經修好了。 – 2010-08-06 15:00:32

2

我認爲問題是你如何執行你的sp。

declare @i int = 0 

EXEC [TestStoredProcedure] '1', @i OUTPUT 

select @i 

也許你忘了OUTPUT關鍵字...

編輯:如果它這樣 - 使用SCOPE_IDENTITY(),因爲這是更好的方式來獲得價值,你的情況的ID。

+0

錯誤是間歇性的,所以沒有像輸出關鍵字那樣的重大錯誤。我在使用SCOPE_IDENTITY()時發生錯誤,並將其更改爲代碼中的問題作爲嘗試工作 – DaveC 2010-08-06 15:38:56

+0

嘗試執行DBCC CHECKIDENT,也許你會得到一些額外的信息 – gyromonotron 2010-08-06 15:52:43

+0

也許這可以幫助 - http: //connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value – gyromonotron 2010-08-08 20:31:48

相關問題