有没有办法手动设置@@ ROWCOUNT?

时间:2017-11-08 11:00:15

标签: sql sql-server

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

SET NOCOUNT OFF
DECLARE @table TABLE(col1 INT IDENTITY(1,1), col2 INT)
INSERT INTO @table(col2) VALUES (1),(2),(3),(4)

这将显示(4 row(s) affected)

现在我想要的是什么:

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,然后使用rowsAffected = ExecuteNonQuery(...)

将该值返回给c#客户端

这可以吗?
(注意:我使用存储过程,并且不想使用OUT参数或返回记录集)

2 个答案:

答案 0 :(得分:1)

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

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或负数,则可能需要调整过滤

答案 1 :(得分: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)