sp_MSforeachdb: inclure seulement les résultats à partir de bases de données avec les résultats
Je suis en cours d'exécution ci-dessous la procédure stockée sp_MSforeachdb
avec une simple commande. Ma question est de savoir comment limiter le nombre de résultats à afficher uniquement les bases de données qui ont au moins 1 record de satisfaire la commande:
Voici ma procédure stockée:
EXECUTE master.sys.sp_MSforeachdb 'USE [?];
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = ''Tabs''))
BEGIN
SELECT ''?'' as dbname,T.TabName, T.TabPath
FROM Tabs T
WHERE T.TabID IN (
SELECT Distinct TM.TabID
FROM TabModules TM
WHERE mID IN (
...
)
)
ORDER BY T.TabName
END
'
Des idées comment je peux modifier la sp, afin de ne pas afficher les bases de données qui ont des résultats vides (voir l'image)?
OriginalL'auteur mustang888 | 2013-11-21
Vous devez vous connecter pour publier un commentaire.
Eh bien, tout d'abord, arrêtez d'utiliser
sp_MSforEachDb
. Oh, les problèmes (si vous voulez la preuve, voir ici, ici et ici).Comment sur:
Si vous voulez vraiment un inconnu, nombre arbitraire de séparer les jeux de résultats, le changement est simple.
La requête SQL sera tronquée à la fin si votre requête est assez grande et/ou que vous avez un grand nombre de bases de données. Je peux vous assurer qu'il n'est pas le fait de tomber tronqué sauf si il a vraiment plus d'un milliard de caractères; c'est juste un triste limitation dans le
PRINT
de commande. J'ai volontairement créé comme unUNION
requête parce que je ne pense pas que c'est un très commun obligation de disposer d'un nombre inconnu de jeux de résultats. Si c'est ce que vous voulez vraiment, vous pouvez toujours faire un dump de la sortie dans un table #temp et ensuite exécuter un curseur contre, le traitement de l'lignes pour chaque nom de base de données...hmmm c'est bizarre parce que c'est certainement en omettant les 30 derniers caractères de la requête, et pourtant, la requête est waaaay en vertu d'un milliard de caractères (seulement 3 bases de données de satisfaire les conditions de la requête). Aussi, comment puis je faire pour que la commande exécuter la requête directement (sans m'manuellement l'exécution de la requête générée)?
ENCORE une fois, il s'agit d'une limitation de la commande d'IMPRESSION. Faire la requête répétée plus court et je vous garantis que vous verrez tout cela. Et juste décommentez la
EXEC
et vous verrez, il est exécuté et ne présentent pas l'erreur que vous attendez basé sur le texte tronqué que l'IMPRESSION est de vous montrer. Les milliards de caractères est une exagération - si vous êtes à la génération d'une requête qui est un milliard de caractères, vous avez d'autres questions.OriginalL'auteur Aaron Bertrand
En gros, vous avez besoin d'un autre SI uniquement l'exécution de l'sélectionnez s'il existe des données.
Voici ce que j'ai fait pour le tester.
Sur DB1:
Sur DB2:
Donc, vous voulez DB1 à retourner des résultats, mais DB2 pas. vous pouvez utiliser la requête sql suivante:
Ce ne renvoie:
db1, 1
OriginalL'auteur Ali