2015-09-26 140 views
1

我有一个存储过程,我传递一个ID并希望返回传入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,它选择从AdministrationHistoryAdministrationHistoryID,我想返回AdministrationHistoryIDint

我试图执行这一点,我得到一个错误

消息207,级别16,状态1,过程usp_GetAdministratorHistoryIDByAdministratorID,16号线
无效的列名称AdministrationHistoryID“。

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

回答

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条款这可能会失败

+1

这完美地工作,它成功,返回AdministrationHistoryID,我会尽快接受,因为它让我 – Chris

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