对于存储过程的本地范围,是否存在等效的@@ rowcount

时间:2017-11-10 16:20:11

标签: sql-server tsql

SQL Server中是否有等效的@@RowCount跟踪存储过程本地范围的已修改/已插入/已删除的行?我正在考虑与@@identity vs scope_identity()的行为类似的行为,而不是行数。

链接到有关上述身份的讨论: https://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/

2 个答案:

答案 0 :(得分:1)

您可以使用变量实现它:

DELCARE @row_count INT = 0;

-- DML INSERT/MERGE/UPDATE/DELETE
SET @row_count += @@rowcount;

-- DML INSERT/MERGE/UPDATE/DELETE
SET @row_count += @@rowcount;


PRINT @row_count;

对于迁移脚本,我只需使用OUTPUT INTO方法并记录有趣的信息:

CREATE TABLE a(id INT IDENTITY(1,1), i INT);
CREATE TABLE log(id INT IDENTITY(1,1), creation_date DATETIME DEFAULT GETDATE(),
                      operation VARCHAR(20), table_name VARCHAR(20), id_ INT);

INSERT INTO a(i)
OUTPUT 'INSERT', 'a', inserted.id
INTO log(operation, table_name, id_)
VALUES (10)
;

UPDATE a
SET i = 10
OUTPUT 'UPDATE','a', inserted.id
INTO log(operation, table_name, id_);

DELETE FROM a
OUTPUT 'DELETE','a', deleted.id
INTO log(operation, table_name, id_);

SELECT *
FROM log;

<强> Rextester Demo

迁移结束后,您只需使用COUNT进行聚合即可。它会为您提供有关所发生事件的更多信息,而不仅仅是简单的@@rowcount

答案 1 :(得分:0)

您确定 @@rowcount 在本地范围内不能正常工作吗?我做了一个快速测试,看看它是否受到触发器的影响,似乎不是:

create table test (x int not null)
create table test_1 (y int not null)
trigger dbo.test_ins on dbo.test after insert as insert into test_1 values (5), (6)
insert into test values (1)
select @@rowcount
           1
select count(*) from ed_test_1
           2

这就是我想要的行为:即使插入导致 2 行被插入到某个其他表中,通过触发器,@@rowcount 值是插入到主表中的计数。这与 @@identity 不同,后者被触发器搞砸了:

create table test (x int not null identity, x1 int not null)
create table test_1 (y int not null identity, y1 int not null)
create trigger dbo.test_ins on dbo.test after insert as insert into test_1 (y1) values (5), (6)
insert into test (x1) values (1)
select @@identity
    2
insert into test (x1) values (2)
select @@identity
    4

这里,@@identity 指的是触发器所做的任何事情,而不是我要求的主要插入。因此,虽然我同意应避免使用 @@identity,并且使用 scope_identity()output 子句,但我认为不存在避免使用 @@rowcount 的相同理由。< /p>

select @@version
Microsoft SQL Server 2016 (SP2-CU12) (KB4536648) - 13.0.5698.0 (X64)
...