我有这个程序从表中删除一行
CREATE PROCEDURE [dbo].[spConfiguration_test]
@ID int
AS
Declare @ERR int
set @ERR = 0
DECLARE @Rows int
SET @Rows =0
begin tran
delete from de where ClaimVersion=5
set @ERR = @@Error
SELECT @Rows= @Rows + @@ROWCOUNT;
if @ERR = 0 commit tran
else rollback tran
我希望它返回一个类似1或2或3的值,具体取决于删除的行数
但它给了我(1 row(s) affected)
我必须做出哪些改变?
答案 0 :(得分:1)
请注意,存储过程名称的sp
前缀应留给Microsoft使用。
如果您想要访问指示是否删除了行的标志,那么您可能希望将其添加为输出参数。
使用事务来包装单个DELETE
语句并不会做太多事情。我假设这是更大程序的一部分,我已经离开了交易代码。
如果您在事务中有多个步骤,则可能需要使用RaIsError
向调用者指示出现问题的位置,并提供某些特定于应用程序的上下文,例如:传递给程序的参数。
您还可以在存储过程中使用try
/ catch
。有时候很方便,有时候很笨拙取决于你需要执行什么样的操作以及你需要了解多少异常。
create procedure [dbo].[Configuration_test]
@Id Int, -- Unused.
@Deleted Int Output -- Flag: 1 if any rows are deleted, 0 otherwise.
as
set nocount on
declare @Err as Int = 0;
set @Deleted = 0;
begin transaction;
delete
from de
where ClaimVersion = 5;
select @Deleted = case when @@RowCount > 0 then 1 else 0 end,
@Err = @@Error;
if @Err != 0
begin
rollback transaction;
return;
end;
-- Next operation...
set @Err = @@Error;
if @Err != 0
begin
rollback transaction;
RaIsError( 'Boo boo in step 42 processing Id %d.', 13, 42, @Id );
end;
-- Repeat operation/error check...
commit transaction;
答案 1 :(得分:0)
在@@RowCount
之后立即将引用移至delete
。或者,在一个语句中组合两个赋值:
delete from de where ClaimVersion = 5 ;
select @Rows = @Rows + @@ROWCOUNT, @ERR = @@Error;
答案 2 :(得分:0)
您也可以SET NOCOUNT OFF
。
说明
当SET NOCOUNT为ON时,不返回计数(表示受Transact-SQL语句影响的行数)。当SET NOCOUNT为OFF时,返回计数。
CREATE PROCEDURE [dbo].[spConfiguration_test]
@ID int
AS
Declare @ERR int
set @ERR = 0
SET NOCOUNT OFF
begin tran
delete from de where ClaimVersion=5
set @ERR = @@Error
if @ERR = 0 commit tran
else rollback tran
SP创建后执行SP如下:
EXEC [dbo].[spConfiguration_test]
@ID = 0
答案 3 :(得分:0)
您面临的问题是@@RowCount
返回受前一个语句影响的行数。
在您的情况下,之前的陈述是:set @ERR = @@Error
试试这个
DELETE
FROM de
WHERE ClaimVersion = 5
;
SELECT @ERR = @@Error
, @Rows = @@RowCount
;
PRINT @Rows;
P.S。不要在程序名称前添加" sp"之类的内容。这与使用" tbl"前缀所有表格一样糟糕。