存储过程返回UPDATE的结果

时间:2010-06-23 15:01:30

标签: sql sql-server stored-procedures

我有一个用于存储递增数字ID(INT类型)的表。它包含一行。使用查询增加ID:

UPDATE TOP(1) MyTable
WITH(TABLOCKX)
SET NextID = NextID + 1

我想将此移动到一个存储过程中,该存储过程返回增加之前在NextID列中的值,但不确定如何使用OUTPUT参数执行此操作。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

在SQL2005或更高版本中,可以使用OUTPUT子句检索以前的更新值值。

鉴于只返回一个值,我不知道这与Tom的方法相比如何。我怀疑Tom会更快,因为有额外的读取但没有创建表变量的开销。 (编辑:,当然我的仍然必须阅读表格变量!)

CREATE PROC blah
@OldId int OUTPUT
AS

DECLARE @OldIds table( NextID int);


UPDATE TOP(1) MyTable
WITH(TABLOCKX)
SET NextID = NextID + 1
OUTPUT DELETED.NextID INTO @OldIds

SELECT @OldId = NextID
FROM @OldIds

答案 1 :(得分:3)

对于SQL Server 2005+,请尝试:

CREATE PROCEDURE dbo.Get_New_My_Table_ID
    @current_id INT = NULL OUTPUT    -- Declared OUTPUT parameter
AS
BEGIN TRANSACTION

UPDATE TOP(1) MyTable WITH(TABLOCKX)
    SET NextID = NextID + 1
    OUTPUT DELETED.NextID

COMMIT TRANSACTION

RETURN 0
GO

OUTPUT的结果不需要进入实际表,它可以是结果集。

测试出来:

declare @MyTable table (NextID int)
INSERT INTO @MyTable VALUES (1234)


SELECT 'BEFORE',* FROM @MyTable

PRINT '------------<<<<UPDATE>>>>---------'
UPDATE TOP(1) @MyTable
    SET NextID = NextID + 1
    OUTPUT DELETED.NextID
PRINT '------------<<<<UPDATE>>>>---------'

SELECT 'AFTER',* FROM @MyTable

输出:

(1 row(s) affected)
       NextID
------ -----------
BEFORE 1234

(1 row(s) affected)

------------<<<<UPDATE>>>>---------
NextID
-----------
1234

(1 row(s) affected)

------------<<<<UPDATE>>>>---------
      NextID
----- -----------
AFTER 1235

(1 row(s) affected)

答案 2 :(得分:2)

您可能想要添加一些错误检查等。我还假设该表是一行表。

CREATE PROCEDURE dbo.Get_New_My_Table_ID
    @current_id INT = NULL OUTPUT    -- Declared OUTPUT parameter
AS
BEGIN
    BEGIN TRANSACTION

    SELECT
        @current_id = COALESCE(next_id, 0)
    FROM
        dbo.My_Table WITH (TABLOCK, HOLDLOCK)

    UPDATE dbo.My_Table
    SET next_id = @current_id + 1

    COMMIT TRANSACTION
END
GO

使用存储过程:

DECLARE @my_id INT

EXEC dbo.Get_New_My_Table_ID @current_id = @my_id OUTPUT