从动态SQL返回提取值(Extract value returned from dynamic SQ

2019-07-31 06:35发布

我有一个生成并执行了一块,一旦建立了动态​​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 ,因为它返回一个记录,其的记录数。

是否有这样做,例如,没有结果写入到一个临时表的(相对)优雅的方式?

Answer 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强制限制,运行相同的语句两次是不是很有效。



Answer 2:

你碰到的问题是,高管声明保留以前的@@ ROWCOUNT值,而你的情况是从1 SET语句(所有组语句使@@ ROWCOUNT变成1)。 这是必要的,因为执行创建自己的批处理。

获取价值的最佳方法是使用sp_executesql的与输出paramater。 这看起来是这样的:

declare @numRows int
declare @sql nvarchar(max)
set @sql = N'Select @numRows= count(*) from dbo.temp'

exec sp_executesql @sql, N'@numRows int output', @numRows output

--Put your if statement here using @numRows

这将使用sp_executesql的公司有输出参数从计回报价值的能力。

一个很好的来源,对一般的动态查询,我建议所有严重SQL programms的详细信息是动态SQL的诅咒和祝福 ,说明如何paramaterize sp_executesql的,为什么你可能要与其他几个相关的主题一起。



Answer 3:

Declare @Rowcount int
SELECT @RowCount = count(1) 
FROM         
dbo.tblUserAuditLog 
    LEFT OUTER JOIN dbo.tblUsers 
    ON dbo.tblUserAuditLog.intUserIdFK = dbo.tblUsers.intUserId


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]
    , @RowCount
FROM         
dbo.tblUserAuditLog 
    LEFT OUTER JOIN dbo.tblUsers 
    ON dbo.tblUserAuditLog.intUserIdFK = dbo.tblUsers.intUserId


文章来源: Extract value returned from dynamic SQL