考虑这个脚本来说明我想要的东西:
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(...)
这可以吗?
(注意:我使用存储过程,并且不想使用OUT参数或返回记录集)
答案 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)