我正在编写存储过程,并且当某些内容失败时我想返回0条记录。我似乎无法弄清楚如何只返回0行?我已经使用了SELECT NULL
但是这会在第1行col 1中返回1行NULL
。我还尝试在错误代码路径中没有指定任何SELECT
语句但是在测试值时在调用SP后@@ROWCOUNT
,它返回1.我认为这可能是因为@@ROWCOUNT
从未在SP之前的SELECT
语句中重置(在{{1}中}})。任何建议将不胜感激。
另外,我已将EXISTS()
设置为ON,但我还使用了XACT_ABORT
块来确保从存储过程返回正确的错误“返回值”。这个可以吗?如果出现错误,TRY/CATCH
是否会覆盖XACT_ABORT
,还是我的错误代码路径仍会导致返回正确的返回值?
TRY/CATCH
答案 0 :(得分:12)
要返回0行,您可以执行以下操作:
SELECT TOP 0 NULL AS MyValue
就个人而言,我会使用这个sproc的OUTPUT参数来返回ID而不是返回结果集 - 这只是我的偏好。然后只需将输出参数设置为例如-1默认表示没有完成。
答案 1 :(得分:1)
我就是这样做的:
CREATE PROCEDURE YourProcedure
AS
( @NewMyValue int OUTPUT --<<<<<use output parameter and not a result set
)
BEGIN TRY
--<<<<put everything in the BEGIN TRY!!!
-- 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
--<<init multiple variables in a select, it is faster than multiple SETs
--set defaults
SELECT @return = 1 -- Default to general error
,@NewMyValue=NULL
-- Start transaction
BEGIN TRANSACTION --<<<put the transaction in the BEGIN TRY
--<<<lock rows for this transaction using UPDLOCK & HOLDLOCK hints
IF NOT EXISTS(SELECT NULL FROM [MyTable] WITH (UPDLOCK, HOLDLOCK) WHERE [Check] = 1)
BEGIN
-- Insert new record
INSERT INTO [MyTable] (Check, Date) VALUES (1, GETDATE());
SELECT @NewMyValue=SCOPE_IDENTITY() --<<<set output parameter, no result set
,@return = 0; -- Success
END
ELSE
BEGIN
-- Fail
--<<no need for a result set!!! output parameter was set to a default of NULL
SET @return = 2; -- Fail error
END
COMMIT TRANSACTION --<<<commit in the BEGIN TRY!!!
END TRY
BEGIN CATCH
-- Error
IF XACT_STATE()!=0 --<<<only rollback if there is a bad transaction
BEGIN
ROLLBACK TRANSACTION
END
--<<any insert(s) into log tables, etc
--<<no need for a result set!!! output parameter was set to a default of NULL
SET @return = 1; -- General error
END CATCH
-- End transaction and return
RETURN @return;
GO