2017-09-28 8 views
1

Mon objectif est de trouver les procédures stockées affectées sur plusieurs bases de données lorsqu'une table ou une vue est mise à jour. Je travaille dans un environnement avec plusieurs bases de données où ces procédures stockées peuvent exister. Voici une requête qui peut faire ce que je veux pour une base de données.Peut et comment utiliser plusieurs bases de données en même temps dans SQL avec l'instruction USE?

Comment puis-je obtenir les résultats sans avoir à modifier l'instruction USE pour DatabaseB, DatabaseC, etc. ou de longues requêtes impliquant UNIONs?

USE DatabaseA 

SELECT 

     O.name 
    , O.type_desc 
    , M.definition 

FROM sys.sql_modules M 

LEFT JOIN sys.objects O 
ON O.object_id = M.object_id 

WHERE 1=1 
    AND definition LIKE '%Error%' 

J'ai joué avec la boucle, mais en vain.

DECLARE name_Cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
OPEN name_Cursor; 
FETCH NEXT FROM name_Cursor; 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     FETCH NEXT FROM name_Cursor; 
    END; 
CLOSE name_Cursor; 
DEALLOCATE name_Cursor; 
GO 

Répondre

1

Si vous avez pris votre curseur existant (à partir de votre deuxième exemple de code), et vous avez branché votre requête (à partir de votre premier exemple de code) dans comme une requête dynamique, il devrait fonctionner:

SET @SQL = ' 
USE ' + @DatabaseName + ' 

SELECT 

     O.name 
...' 

Si vous souhaitez exécuter cette requête sur TOUTES vos bases de données, une solution peut-être plus simple consisterait à utiliser la procédure stockée système non documentée sp_msforeachdb.

0

Je sais que vous êtes réticent à utiliser UNION, mais cela peut être utile pour votre situation. Si vous avez le luxe d'utiliser Linked Servers, vous pouvez utiliser UNION avec des chemins complets. Je recommande également d'utiliser INFORMATION_SCHEMA.ROUTINES si vous le pouvez.

SELECT ROUTINE_NAME FROM [DB1].[dbo].INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%Error%' 
UNION ALL 
SELECT ROUTINE_NAME FROM [DB2].[dbo].INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%Error%' 

Vous pouvez également utiliser une approche de table optimisée de la mémoire:

https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/cross-database-queries

Si vous avez besoin de faire quelque chose pour chaque proc trouvé, utiliser comme instruction SELECT du curseur.