Intermittently эта хранимая процедура возвращает идентификатор, который в миллионы, когда он должен быть на самом деле только около 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);
Эта хранимая процедура используется для возврата ID с помощью SCOPE_IDENTITY(), но это был один и тот же вопрос ,
В базе данных нет триггеров. На первичных ключах, которые SQL Server создает автоматически, есть только индексы. Нет никаких таблиц, у которых есть идентификатор где-нибудь рядом с тем, что возвращается, поэтому я понятия не имею, откуда эти большие числа.
Любая помощь или предложения будут оценены.
Edit: Как я уже говорил выше, эта хранимая процедура первоначально использовали 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();
Edit 2:
Точная SQL версия:
Microsoft SQL Server 2005 - 9.00.4230.00 (X64) 30.07.2009 13:42:21 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition (64-разрядная версия) в Windows NT 5.2 (сборка 3790: с пакетом обновления 2)
Edit 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 ('Table') возвращается:
Проверка идентификационной информации: текущее значение идентификации «422», текущее значение столбца «422». DBCC исполнение завершено. Если DBCC печатал сообщения об ошибках, обратитесь к системному администратору.
Это как и ожидалось.
Я никогда не был поклонником «топ-1». Вы получаете те же проблемы, если вместо этого используете max (InertedID)? –
Довольно уверен, что '@ ResultsTable' является излишним - должен быть в состоянии установить' @ ID' в разделе OUTPUT –
В таблице есть ли временная метка, когда произошла вставка? Если это так, вы можете SELECT TOP 1 AutoGeneratedID из таблицы ORDER BY timestampcolumn DESC – mpenrow