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