2015-09-26 138 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