Mic*_*all 7 sql t-sql sql-server stored-procedures sql-server-2005
我正在写一个存储过程,我想在出现故障时返回0条记录.我似乎无法弄清楚如何只返回0行?我已经使用SELECT NULL但是这会返回1行,并且NULL在第1行第1行中.我也尝试不在SELECT我的错误代码路径中指定任何语句但是在测试@@ROWCOUNTSP之后的值时,它返回1.我认为这可能是因为@@ROWCOUNT从未SELECT在SP中早先的声明(在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;
Run Code Online (Sandbox Code Playgroud)
Ada*_*Dev 12
要返回0行,您可以执行以下操作:
SELECT TOP 0 NULL AS MyValue
Run Code Online (Sandbox Code Playgroud)
就个人而言,我会使用这个sproc的OUTPUT参数来返回ID而不是返回结果集 - 这只是我的偏好.然后将该输出参数设置为例如-1作为默认值以指示什么都没做.
| 归档时间: |
|
| 查看次数: |
5408 次 |
| 最近记录: |