如何获得受影响的行数作为数值

时间:2015-02-11 12:11:32

标签: sql-server tsql sql-server-2012

我有这个程序从表中删除一行

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)

我必须做出哪些改变?

4 个答案:

答案 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"前缀所有表格一样糟糕。