gpt4 book ai didi

sql-server - 提取动态 SQL 返回的值

转载 作者:行者123 更新时间:2023-12-02 16:11:34 24 4
gpt4 key购买 nike

我有一个存储过程,它生成并执行一段动态 T-SQL,一旦构建完成,它看起来像这样

SELECT 
tblUsers.strUserName AS [Username]
,tblUsers.strEmail AS [Email]
,tblUserAuditLog.strIpAddress AS [IP Address]
,tblUserAuditLog.dtAuditTimeStamp AS [Timestamp]
,tblUserAuditLog.strAuditLogAction AS [Action]
,tblUserAuditLog.strLogDetails AS [Details]
FROM
tblUserAuditLog
LEFT OUTER JOIN tblUsers
ON tblUserAuditLog.intUserIdFK = tblUsers.intUserId
WHERE
tblUsers.strUserName = 'a12jun'
AND tblUserAuditLog.dtAuditTimeStamp >= '2012-08-10'

此查询可以在开发环境中返回数千行,并且在实时环境中将返回更多行。

我想在实际返回结果之前了解动态查询返回了多少行,这样,如果数量超过某个限制,我可以返回“缩小查询范围”错误消​​息。

我尝试生成另一条 SQL,如下所示:

DECLARE @sqlrowcount NVARCHAR(MAX);
SET @sqlrowcount = 'SELECT COUNT(*) FROM (' + @sql + ') AS TEMP';
EXEC(@sqlrowcount);

IF @@ROWCOUNT > @limit BEGIN .... END

其中@sql是动态查询。然后我尴尬地意识到 EXEC(@sqlrowcount) 将始终返回 1,因为它返回一条记录,其是记录数。

有没有一种(相对)优雅的方式来做到这一点,例如不将结果写入临时表?

最佳答案

单向;

--base sql
declare @sql nvarchar(255) = N'select * from master.dbo.spt_values'

--count wrapper
declare @sqlb nvarchar(255) = N'set @count=(select count(*) from (' + @sql + ') T)'

declare @count int
exec sp_executesql @sqlb, N'@count int output', @count output

select 'rows=',@count

您还可以使用TOP来强制执行限制,运行相同的语句两次效率不高。

关于sql-server - 提取动态 SQL 返回的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12201023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com