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

Sql server 如何获得作为数值影响的行数,sql-server,tsql,sql-server-2012,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;

我有一个从表中删除一行的过程

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行受影响)


我必须做哪些更改?

删除之后立即将引用移动到
@@RowCount
。或者,将两个赋值合并到一个语句中:

delete from de where ClaimVersion = 5 ;

select @Rows = @Rows + @@ROWCOUNT, @ERR = @@Error;

您还可以
设置NOCOUNT OFF

评论

启用SET NOCOUNT时,不会返回计数(指示受Transact-SQL语句影响的行数)。当SET NOCOUNT关闭时,将返回计数

    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

您面临的问题是
@@RowCount
返回受上一条语句影响的行数

在您的情况下,前面的语句是:
set@ERR=@@Error

试试这个

DELETE
FROM   de
WHERE  ClaimVersion = 5
;

SELECT @ERR  = @@Error
     , @Rows = @@RowCount
;

PRINT @Rows;

注意,不要在过程名称前加上“sp”之类的前缀。这就像在所有表前面加上“tbl”一样糟糕。

请注意,存储过程名称上的
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;

@SpringLearner—那么您的delete语句只删除一行。运行
Select*from de where ClaimVersion=5时得到多少行
yes它只删除一行,但我希望它作为数值。实际上,我使用java执行这个过程,就像这个公共整数deleteSublist(Integer subPartsId){String storedProcedure=“exec spConfiguration\u SubParts\u Del”+subPartsId;System.out.println(storedProcedure);Query Query=entityManagerUtil.entityManager.createNativeQuery(storedProcedure);return Query.executeUpdate();}将其移到前面将导致
@Err
始终为
0
,由于
@Error
@@RowCount
的行为相同,它只适用于前一个项目。它总是说(受影响的1行)或(受影响的2行)等,我不希望这样。我想要一个类似于从Select count(*)中获得的值的值如果我使用PRINT@Rows;然后它只在sql server控制台中打印。我在一个返回类型为integer的java方法中调用这个SP。如果删除了2行,那么它应该返回2。sql server控制台中返回的vvalue是什么?打印行是为了证明您得到了正确的值,而不是Java。让我们先证明SQL是正确的!P.S.@SpringLearner by“return type is integer”您的意思是:存储过程返回一个整数值或一个整数数据集(即使该数据集是单个值)。打印行打印删除的行数。我的要求是存储过程应该返回值1,如果至少删除了一行,否则0谢谢回答+1,我将按照您的建议尝试,我从7个表中删除,所以我使用的是事务,但这里有一个单表的示例table@SpringLearner-该示例更新为事务中多个操作的改进错误处理。