如何从存储过程返回ID?

时间:2015-09-26 14:19:57

标签: sql-server stored-procedures

我有一个存储过程,我传递一个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,它从AdministrationHistoryID表中选择AdministrationHistory并且我希望将AdministrationHistoryID作为int

我尝试过执行此操作并收到错误

  

Msg 207,Level 16,State 1,Procedure usp_GetAdministratorHistoryIDByAdministratorID,Line 16
  列名称无效' AdministrationHistoryID'。

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

2 个答案:

答案 0 :(得分:2)

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

您只能在try块中提交一个事务,并且只在catch块中回滚一个事务。因为你的控件永远不会进入catch块,除非try块中出现问题。

更简单的存储过程版本就像......

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

答案 1 :(得分:0)

使用:

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

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

可替换地:

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

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