存储过程的本地作用域是否有等效的@@rowcount


SQL

Server 中是否有等效的@@RowCount来跟踪存储过程本地范围的已修改/插入/删除行?我正在考虑类似于@@identityscope_identity()的行为,但对于行计数。

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

您可以使用变量实现它:

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 演示

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

您确定@@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的相同原因。

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

最新更新