微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何从TSQL SPROC中的EXEC获取行数?

| 我有一个Tsql sproc,它可以按如下方式构建查询并执行该查询
EXEC (@sqlTop + @sqlBody + @sqlBottom)
@sqlTop包含类似SELECT TOP(x)col1,col2,col3的内容... TOP(x)将限制返回的行,因此以后我想知道表中与查询匹配的实际行数是多少。 然后,我将@sqlTop替换为:
EXEC (\'SELECT @ActualNumberOfResults = COUNT(*) \' + @sqlBody)
我可以看到为什么这行不通,为什么会出现未声明的值错误,但是我认为它足以描述我要完成的工作。 有任何想法吗?     

解决方法

        相反,您可以让动态查询以行集的形式返回结果,然后使用
INSERT ... EXEC
语法将其插入到表变量(也可以是临时表或普通表)中。然后,您可以使用
SELECT @var = ...
将保存的值读入变量:
DECLARE @rowcount TABLE (Value int);
INSERT INTO @rowcount
EXEC(\'SELECT COUNT(*) \' + @sqlBody);
SELECT @ActualNumberOfResults = Value FROM @rowcount;
    ,        用
sp_executesql
和an6ѭ 例
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
    ,        一天晚上,但我发现这种方法要简单得多:
-- 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;
    ,        执行完实际查询后,将
@@ROWCOUNT
的结果存储在以后可以使用的任何变量中。
EXEC sp_executesql \'SELECT TOP 10 FROM ABX\'
variable11ѭ进入变量供以后使用。     ,        请记住,动态SQL有其自己的范围。在
EXEC
sp_executesql
之后,在那里声明/修改的任何变量都将超出范围。 建议写入临时表,该表将在动态SQL语句的范围之内和之外。 也许把它放在你的
sqlBottom
中:
CREATE TABLE ##tempCounter(MyNum int);

EXEC(\'SELECT @ActualNumberOfResults = COUNT(*) \' + @sqlBody + 
       \'; INSERT INTO ##tempCounter(MyNum) VALUES(@ActualNumberOfResults);\');

SELECT MyNum FROM ##tempCounter;
    ,        创建临时表(使用\“ DECLARE @rowcount TABLE \”或\“ CREATE TABLE ## tempCounter(MyNum int)\”)的答案的唯一问题是,您必须先读取所有受影响的记录磁盘插入内存。如果您期望大量的记录,则可能需要一些时间。 因此,如果答案可能很大,则“使用sp_executesql和输出参数”解决方案是更有效的答案。它似乎确实起作用。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。