有没有手动设置@@ROWCOUNT的方法?(问题涉及IT技术)

3
考虑以下脚本以说明我的意图:

考虑这个脚本来说明我想要的:

SET NOCOUNT OFF
DECLARE @table TABLE(col1 INT IDENTITY(1,1), col2 INT)
INSERT INTO @table(col2) VALUES (1),(2),(3),(4)
这将显示(影响4行) 现在我想要的是:
SET NOCOUNT ON
DECLARE @table TABLE(col1 INT IDENTITY(1,1), col2 INT)
INSERT INTO @table(col2) VALUES (1),(2),(3),(4)
-- do other stuff...

SET NOCOUNT OFF
SELECT @@ROWCOUNT = 666 -- return this value to client with ExecuteNonQuery()
显然,SELECT @@ROWCOUNT = 666 是不正确的语法。 我需要手动设置 @@ROWCOUNT 并将该值返回给 C# 客户端,使用 rowsAffected = ExecuteNonQuery(...)。 这可以完成吗? (注意:我使用存储过程,不想使用 OUT 参数或返回记录集)

2
如果你想要返回一个值,那么不要依赖于使用受影响的行数。可以使用“OUTPUT”参数或例如“SELECT 666”。 - DavidG
1
@DavidG,我不想返回OUT参数或记录集。 - zig
4
那么你无法做你想做的事情。不能(也不应该)操纵所影响的行数,这是不可能的。 - DavidG
2个回答

2

创建一个人工的(受影响行数)消息的明显方法是执行一个影响该数量行的操作,同时尽可能减少副作用:

declare @t table (n int not null)
;With Numbers (n) as (
    select ROW_NUMBER() OVER (ORDER BY so1.object_id)
    from sys.objects so1,sys.objects so2
)
insert into @t(n) select n from Numbers where n<=666

我无法确定欺骗ExecuteNonQuery是否足够。(如果您有实际的Numbers表,可以将其用于CTE的位置,但如果它包含0或负数,则可能需要调整过滤)


3
这太糟糕了,没有实际意义却浪费了服务器资源。 - DavidG
1
实际上,在我的数据库中,它显示 (100 行受影响),因为 select ROW_NUMBER() OVER (ORDER BY so1.object_id) from sys.objects so1,sys.objects so2 只返回了 100 行。是的,我同意这是一个可怕的 解决方案 - zig
@zig - 你可以添加更多的sys.objects交叉连接以增加Numbers中行数的倍数。你现在一定是在一个很小的数据库上工作(我在一个有大约10个表、5个存储过程、1个视图,大多数对象都有5列或更少的数据库上运行,结果得到了一个666的消息)。 - Damien_The_Unbeliever
1
@DavidG - 有时候我们不得不做一些可怕的事情,比如在这里,我可能会在临时数据库中使用额外的页面几毫秒钟。如果OP只能操作存储过程的内容,并且无法更改已知使用ExecuteNonQuery且无法添加其他参数的调用代码... - Damien_The_Unbeliever
我接受这个答案,因为我猜没有其他办法了。谢谢。 - zig

0

另一种实现这个的方法是:

SET NOCOUNT ON
-- Do stuff
SET NOCOUNT OFF
-- Run the actual query that will affect the specified number of rows
SET NOCOUNT ON
-- Do more stuff

例子:

CREATE PROCEDURE Example1
AS
SET NOCOUNT ON
    DECLARE @table TABLE(col1 INT IDENTITY(1,1), col2 INT)
    INSERT INTO @table(col2) VALUES (1),(2),(3),(4)
SET NOCOUNT OFF
    SELECT a.*
    INTO #NoWhere
    FROM @table AS a
        CROSS JOIN @table AS b
SET NOCOUNT ON
    SELECT COUNT(*)
    FROM @table AS a
        CROSS JOIN @table AS b
GO;
EXEC Example1
-- (16 row(s) affected)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,