如何从TSQL SPROC中的EXEC()获取行数?

ElH*_*aix 19 t-sql stored-procedures sql-server-2008

我有一个TSQL sproc,它构建一个查询并执行它,如下所示:

EXEC (@sqlTop + @sqlBody + @sqlBottom)
Run Code Online (Sandbox Code Playgroud)

@sqlTop包含类似SELECT TOP(x)col1,col2,col3 ......

TOP(x)将限制返回的行,所以稍后我想知道表中的实际行数与查询匹配的行数.

然后我用以下内容替换@sqlTop:

EXEC ('SELECT @ActualNumberOfResults = COUNT(*) ' + @sqlBody)
Run Code Online (Sandbox Code Playgroud)

我可以看出为什么这不起作用,为什么没有声明错误的值发生,但我认为它充分描述了我想要完成的事情.

有任何想法吗?

And*_*y M 16

您可以改为让动态查询将结果作为行集返回,然后使用INSERT ... EXEC语法将其插入到表变量(也可以是临时表或普通表)中.之后,您可以使用SELECT @var = ...以下方法将已保存的值读入变量:

DECLARE @rowcount TABLE (Value int);
INSERT INTO @rowcount
EXEC('SELECT COUNT(*) ' + @sqlBody);
SELECT @ActualNumberOfResults = Value FROM @rowcount;
Run Code Online (Sandbox Code Playgroud)


SQL*_*ace 14

使用sp_executesqloutput parameter

DECLARE @sqlBody VARCHAR(500),@TableCount INT, @SQL NVARCHAR(1000)

SELECT @sqlBody = 'from sysobjects'
SELECT @SQL = N'SELECT @TableCount = COUNT(*) ' + @sqlBody

EXEC sp_executesql @SQL, N'@TableCount INT OUTPUT', @TableCount OUTPUT

SELECT @TableCount
GO
Run Code Online (Sandbox Code Playgroud)


dow*_*tch 13

当天晚些时候,我发现这种方法更简单:

-- test setup
DECLARE @sqlBody nvarchar(max) = N'SELECT MyField FROM dbo.MyTable WHERE MyOtherField = ''x''';
DECLARE @ActualNumberOfResults int;

-- the goods
EXEC sp_executesql @sqlBody;
SET @ActualNumberOfResults = @@ROWCOUNT;
SELECT @ActualNumberOfResults;
Run Code Online (Sandbox Code Playgroud)

  • [@@ROWCOUNT 的文档](https://msdn.microsoft.com/en-us/library/ms187316.aspx) 表示 EXECUTE 语句不会更改 @@ROWCOUNT。sp_executesql 是异常吗? (2认同)