T-SQL:如何从存储过程返回0行,以及如何使用XACT_ABORT和TRY / CATCH
发布时间:2020-05-24 12:05:24 所属栏目:MsSql 来源:互联网
导读:我正在写一个存储过程,我想在出现故障时返回0条记录.我似乎无法弄清楚如何只返回0行?我已经使用了SELECT NULL但是这会在第1行col 1中返回1行,并且在我的错误代码路径中没有指定任何SELECT语句,但是在调用SP后测试@@ ROWCOUNT的值时,返回1.我认为这可能是因为
|
我正在写一个存储过程,我想在出现故障时返回0条记录.我似乎无法弄清楚如何只返回0行?我已经使用了SELECT NULL但是这会在第1行col 1中返回1行,并且在我的错误代码路径中没有指定任何SELECT语句,但是在调用SP后测试@@ ROWCOUNT的值时,返回1.我认为这可能是因为@@ ROWCOUNT从未在SP之前的SELECT语句中重置(在EXISTS()中).任何意见,将不胜感激. 此外,我已将XACT_ABORT设置为ON,但我还使用了TRY / CATCH块以确保从存储过程返回正确的错误“返回值”.这个可以吗?如果有错误,XACT_ABORT会覆盖TRY / CATCH还是我的错误代码路径仍会导致返回正确的返回值? -- Setup
SET NOCOUNT ON; -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET XACT_ABORT ON; -- SET XACT_ABORT ON rollback transactions on errors
DECLARE @return int; SET @return = 1; -- Default to general error
-- Start transaction
BEGIN TRANSACTION
BEGIN TRY
IF NOT EXISTS(SELECT NULL FROM [MyTable] WHERE [Check] = 1)
BEGIN
-- Insert new record
INSERT INTO [MyTable] (Check,Date) VALUES (1,GETDATE());
SELECT SCOPE_IDENTITY() AS [MyValue]; -- Return 1 row
SET @return = 0; -- Success
END
ELSE
BEGIN
-- Fail
SELECT NULL AS [MyValue]; -- Want to return 0 rows not 1 row with NULL
SET @return = 2; -- Fail error
END
END TRY
BEGIN CATCH
-- Error
ROLLBACK TRANSACTION;
SELECT NULL AS [MyValue]; -- Want to return 0 rows not 1 row with NULL
SET @return = 1; -- General error
END CATCH
-- End transaction and return
COMMIT TRANSACTION
RETURN @return;
解决方法要返回0行,您可以执行以下操作:SELECT TOP 0 NULL AS MyValue 就个人而言,我会使用这个sproc的OUTPUT参数来返回ID而不是返回结果集 – 这只是我的偏好.然后将该输出参数设置为例如默认为-1表示没有完成. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server – 如何获取数据库中所有分区表的列表?
- sql – rowversion / timestamp会显着影响性能吗?
- SQL Server每天自动备份数据库并每天自动清除log的脚本
- sql-server-2008 – 强制首先执行初始化不存在的数据库?
- 在MySQL中使用LIMIT进行分页的方法
- SQL Server 求字符串中汉字的个数的sql语句
- 实例学习SQL的Select命令
- sql-server – ADO.Net将“Persist Security Info”默认改回
- sql-server – 在sql server中,sys.types中的user_type_id和
- 全面了解mysql中utf8和utf8mb4的区别
