У меня есть хранимая процедура, которая генерирует и выполняет часть динамического 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
, поскольку возвращает одну запись, значение которой равно количеству записей.
Есть ли (относительно) элегантный способ сделать это, например. без записи результата во временную таблицу?