Sql 为什么此存储过程不返回正确的ID?

Sql 为什么此存储过程不返回正确的ID?,sql,sql-server-2005,stored-procedures,Sql,Sql Server 2005,Stored Procedures,此存储过程将间歇性地返回一个以百万为单位的ID,而实际上它应该只有400左右 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 (

此存储过程将间歇性地返回一个以百万为单位的ID,而实际上它应该只有400左右

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自动创建的主键上的索引。没有任何表的ID接近返回的ID,因此我不知道这些大数字来自何处

如有任何帮助或建议,将不胜感激

编辑: 如上所述,此存储过程最初使用SCOPE_IDENTITY(),如下所示:

编辑2:
确切的SQL版本是:
Microsoft SQL Server 2005-9.00.4230.00(X64)2009年7月30日13:42:21版权所有(c)1988-2005 Windows NT 5.2上的Microsoft Corporation标准版(64位)(版本3790:Service Pack 2)

编辑3:
这就是存储过程的调用方式(好的传统ASP,它是一个遗留站点)

编辑4:
运行DBCC CHECKIDENT('Table')返回:

正在检查标识信息:当前标识值“422”,当前列值“422”。 DBCC执行已完成。如果DBCC打印了错误消息,请与系统管理员联系


这是意料之中的。

我的理解是,在创建行之前,不可能确定分配给标识列的值,这包括尝试通过OUTPUT子句访问它

@@identity和scope_identity()确实应该起作用。你能用那个代码发布你的样本吗


(旁注:当我说“我的理解是……”,我的意思是,我已经在几个版本的SQL Server上对此进行了很多研究,但我从来没有找到一种方法来做到这一点,而且我似乎还记得多年来读过一些帖子和文章,它们说完全不可能做到这一点,但嘿,我真的希望自己是错的,所以我会看这篇帖子。)我认为问题在于如何执行sp

declare @i int = 0

EXEC [TestStoredProcedure] '1', @i OUTPUT

select @i
也许你忘记了输出关键字


编辑:如果是这样的话,请使用SCOPE_IDENTITY(),因为这是在您的情况下获取id值的更好方法。

我从来都不是“top 1”的粉丝。如果改用max(InerteId),您会遇到同样的问题吗?非常确定
@ResultsTable
是过度杀伤力-应该能够在输出子句中设置
@ID
。您是否有插入发生的时间戳?如果是这样,您可以按时间戳从表顺序中选择AutoGeneratedID,这是SQL 2005的哪个版本(运行
SELECT@@version
)@mpenrow-这在多用户环境中不安全您可以使用OUTPUT子句访问新的标识值。但是是的,SCOPE_IDENTITY()应该做这项工作。我从未遇到过使用此方法返回标识的问题-
OUTPUT
子句中的
inserted
表反映插入的行,就像在触发器中一样-请参阅MS文档-。我知道,2005年第一次出现时,我在某个地方读到,输出参数没有捕获标识列。也许我读错了,也许他们写错了,也许他们已经修复了。错误是间歇性的,所以没有什么比输出关键字更重要的遗漏。当错误第一次出现时,我正在使用SCOPE_IDENTITY()并将其更改为问题中的代码,作为一种尝试性的解决方法。请尝试执行DBCC CHECKIDENT,也许您会得到一些其他信息。也许这会有所帮助-
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
declare @i int = 0

EXEC [TestStoredProcedure] '1', @i OUTPUT

select @i