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

Sql server 存储过程的本地作用域是否有与@rowcount等效的值,sql-server,tsql,Sql Server,Tsql,SQL Server中是否有一个等价的@@RowCount,用于跟踪存储过程本地范围内修改/插入/删除的行?我在想一些类似于@@identityvsscope\u identity()的行为,但行计数除外 链接到关于上述身份的讨论: 您可以使用变量: DELCARE @row_count INT = 0; -- DML INSERT/MERGE/UPDATE/DELETE SET @row_count += @@rowcount; -- DML INSERT/MERGE/UPDATE/DEL

SQL Server中是否有一个等价的
@@RowCount
,用于跟踪存储过程本地范围内修改/插入/删除的行?我在想一些类似于
@@identity
vs
scope\u identity()
的行为,但行计数除外

链接到关于上述身份的讨论:

您可以使用变量:

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;

对于迁移脚本,我只需使用
输出到
方法中,并记录有趣的信息:

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;


迁移结束后,只需使用
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
select @@version
Microsoft SQL Server 2016 (SP2-CU12) (KB4536648) - 13.0.5698.0 (X64)
...
这就是我想要的行为:即使insert导致在其他一些表中插入了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\u identity()
output
子句,但我不认为存在同样的原因来避免
@@rowcount

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

重要的是要知道最近生成的标识值,以便在其他表中使用它,从而实现它。虽然没有人关心受会话影响的总行数,但它并没有实现。我正在尝试基于生成的脚本迁移数据。生成脚本的方式是一次插入一个脚本。然后,我将脚本分为批执行。我知道有更好的工具可以做到这一点,但我必须克服组织上的障碍。对于我来说,在所有1000次插入之后放置@@Rowcount是不可行的,所以我希望每批的行数都会受到影响。而且我很惊讶这不是一种更常见的情况,我可能会看到自己在未来的另一家公司/工作中再次遇到这种情况。“没人关心”在编程中是一个相当宽泛的说法,并不真正符合论坛的精神。你有你的答案。没有等价物,没有捷径。老实说,我不认为这种方法有用。迁移脚本往往不只是简单的插入,因此为每个语句累积@rowcount值并不能生成准确的数字。在脚本运行后,只计算所有受影响表中的行可能会更容易。搜索互联网,如果这似乎可以实现你的目标。这通常是我会做的,但我正在使用自动生成的数据迁移脚本,一次生成一个插入。在每次插入1000行数据后添加这一行是不可行的。将其标记为“答案”,实际答案是“否”。没有任何方法可以做到这一点,但这是最好的解决方法。