【发布时间】:2010-08-18 10:13:45
【问题描述】:
我正在编写一个存储过程,我想在失败时返回 0 条记录。我似乎无法弄清楚如何只返回 0 行?我已经使用了SELECT NULL,但这会在第 1 列第 1 行返回 1 行,其中有 NULL。我也尝试在错误代码路径中不指定任何 SELECT 语句,但是在测试 @@ROWCOUNT 的值之后调用 SP,它返回 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;
【问题讨论】:
标签: sql sql-server sql-server-2005 tsql stored-procedures