代码之家  ›  专栏  ›  技术社区  ›  Andy Johnson

返回更新结果的存储过程

  •  4
  • Andy Johnson  · 技术社区  · 16 年前

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

    我想将其移到一个存储过程中,该存储过程返回NextID列中的值 之前 它是递增的,但我不确定如何使用输出参数来执行此操作。任何帮助都将不胜感激。

    3 回复  |  直到 16 年前
        1
  •  4
  •   KM.    16 年前

    对于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
  •  3
  •   Martin Smith    16 年前

    在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
    
        3
  •  2
  •   Tom H zenazn    16 年前

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

    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
    
    推荐文章