Extraire la valeur de retour à partir de SQL dynamique
J'ai une procédure stockée qui génère et exécute un morceau de la dynamique de T-SQL qui, une fois construit, on dirait que cette
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'
Cette requête peut renvoyer plusieurs milliers de lignes dans l'environnement de dev et sera de retour beaucoup plus en live.
Je veux savoir le nombre de lignes de la dynamique de la requête retourne avant que je retourne en fait les résultats, de sorte que, si le nombre est plus que limite, je peux retourner un étroit votre requête " message d'erreur.
J'ai essayé de générer un autre morceau de SQL comme ceci:
DECLARE @sqlrowcount NVARCHAR(MAX);
SET @sqlrowcount = 'SELECT COUNT(*) FROM (' + @sql + ') AS TEMP';
EXEC(@sqlrowcount);
IF @@ROWCOUNT > @limit BEGIN .... END
où @sql
est la dynamique de la requête. J'ai ensuite embarrassante rendu compte que EXEC(@sqlrowcount)
retournera toujours 1
, parce qu'elle renvoie un enregistrement dont la valeur est le nombre d'enregistrements.
Est-il un (relativement) simple et élégant de le faire, par exemple, sans écrire le résultat dans une table temporaire?
OriginalL'auteur Arj | 2012-08-30
Vous devez vous connecter pour publier un commentaire.
;
Vous pouvez également utiliser
TOP
pour faire respecter une limite, qui est le même énoncé deux fois n'est pas très efficace.OriginalL'auteur Alex K.
Le problème que vous rencontrez est que exec états de préserver la précédente @@rowcount valeur, qui dans votre cas est de 1 à partir de l'ensemble consolidé (toutes les instructions set faire @@rowcount devenir 1). Cela est nécessaire parce que exécuter crée son propre lot.
La meilleure façon d'obtenir la valeur est d'utiliser sp_executesql avec une sortie paramater. Qui ressemblerait à quelque chose comme:
Il utilise sp_executesql, la possibilité d'avoir les paramètres de sortie pour renvoyer la valeur de la comte.
Une bonne source pour plus de détails sur les requêtes dynamiques, en général, que je recommande à tous de graves SQL programms est La Malédiction et la Bénédiction de SQL Dynamique qui explique comment paramaterize sp_executesql et pourquoi vous pourriez vouloir, à l'instar de plusieurs autres sujets connexes.
OriginalL'auteur TimothyAWiseman
OriginalL'auteur Lester S