【问题标题】:How to return ID from stored procedure?如何从存储过程中返回 ID?
【发布时间】:2015-12-24 05:30:44
【问题描述】:

我有一个存储过程,我在其中传递一个 ID,并希望返回在传递一个 ID 后给出的选定 ID。这是我想出的......

CREATE PROCEDURE [dbo].[usp_GetAdministratorHistoryIDByAdministratorID]
    @AdministratorID int,
    @AdministrationHistoryID int output
AS
DECLARE @ERROR_SEVERITY int,
        @MESSAGE varchar(1000),
        @ERROR_NUMBER int,
        @ERROR_PROCEDURE nvarchar(200),
        @ERROR_LINE int,
        @ERROR_MESSAGE nvarchar(4000);
begin try
    SELECT AdministrationHistoryID
    from [AdministrationHistory]
    where AdministratorID = @AdministratorID
    set @AdministrationHistoryID = AdministrationHistoryID
end try
BEGIN CATCH
    SET @ERROR_SEVERITY = ISNULL(ERROR_SEVERITY(),'');
    SET @ERROR_NUMBER = ISNULL(ERROR_NUMBER(),'');
    SET @ERROR_PROCEDURE = ISNULL(ERROR_PROCEDURE(),''); 
    SET @ERROR_LINE = ISNULL(ERROR_LINE(),'');
    SET @ERROR_MESSAGE = ISNULL(ERROR_MESSAGE(),'');

    -- Test if the transaction is uncommittable.
    IF (XACT_STATE()) = -1
        BEGIN
            --PRINT N'The transaction is in an uncommittable state. Rolling back transaction.'
            ROLLBACK TRANSACTION;
        END;

    -- Test if the transaction is active and valid.
    IF (XACT_STATE()) = 1
        BEGIN
            --PRINT N'The transaction is committable. Committing transaction.'
            COMMIT TRANSACTION;   
        END;

    SET @MESSAGE = 'Error Occured in Stored Procedure ' + cast(@ERROR_PROCEDURE as varchar(200)) + 
                    '; Line Number ' + cast(@ERROR_LINE as varchar) + 
                    '; Message: [' + cast(@ERROR_NUMBER as varchar) + '] - '
                    + cast(@ERROR_MESSAGE as varchar(255))

    RAISERROR(@MESSAGE, @ERROR_SEVERITY, 1);
END CATCH;

所以我想要实现的是通过传递AdministratorID,它从AdministrationHistory 表中选择AdministrationHistoryID,我想将AdministrationHistoryID 作为int 返回。

我尝试过执行此操作,但出现错误

消息 207,级别 16,状态 1,过程 usp_GetAdministratorHistoryIDByAdministratorID,第 16 行
列名“AdministrationHistoryID”无效。

我知道有一个AdministrationHistoryID,因为它在表格中。

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    用途:

    BEGIN TRY
        SELECT @AdministrationHistoryID = AdministrationHistoryID
        FROM [AdministrationHistory]
        WHERE AdministratorID = @AdministratorID;
    END TRY
    

    请记住,如果此查询返回多行,您将获得最后一个值。

    或者:

    SET @AdministrationHistoryID = (SELECT AdministrationHistoryID
                                    FROM [AdministrationHistory]
                                    WHERE AdministratorID = @AdministratorID);
    

    如果返回多条记录,这可能会失败(如果需要,请添加 DISTINCTTOP 1ORDER BY 子句。

    【讨论】:

    • 这很好,它成功并返回了 AdministrationHistoryID,我会尽快接受
    【解决方案2】:

    请注意,您需要在提交或回滚之前开始事务,此外,在 Catch 块中提交事务意味着您不会提交事务,直到 Try 块中出现问题,这没有任何意义。

    您只会在 try 块中提交事务,而只会在 catch 块中回滚事务。因为除非在 try 块中出现问题,否则您的控件将永远不会进入 catch 块。

    存储过程的一个更简单的版本将类似于.....

    CREATE PROCEDURE [dbo].[usp_GetAdministratorHistoryIDByAdministratorID]
        @AdministratorID int,
        @AdministrationHistoryID int output
    AS
    BEGIN
    begin try
      BEGIN TRANSACTION;
         SELECT @AdministrationHistoryID = AdministrationHistoryID
         from [AdministrationHistory]
         where AdministratorID = @AdministratorID
      COMMIT TRANSACTION;
    end try
    BEGIN CATCH
      IF (@@TRANCOUNT > 0)
        BEGIN
          ROLLBACK TRANSACTION;
        END
    
    Declare @MESSAGE NVARCHAR(4000);
    
        SET @MESSAGE = 'Error Occured in Stored Procedure ' + cast(ERROR_PROCEDURE() as varchar(200)) + 
                        '; Line Number ' + cast(ERROR_LINE() as varchar) + 
                        '; Message: [' + cast(ERROR_NUMBER() as varchar) + '] - '
                        + cast(ERROR_MESSAGE() as varchar(255))
    
        RAISERROR(@MESSAGE, ERROR_SEVERITY(), 1);
    END CATCH
    
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 2015-11-04
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多