我有一个存储过程,我传递一个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
,因为它在表格中。
答案 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);
如果返回多条记录,则可能会失败(如果需要,请添加DISTINCT
或TOP 1
和ORDER BY
子句。