2011-07-13 2 views
0

J'ai créé une procédure stockée SQL Server 2005 qui recherche les objets dépendants sur une table particulière.appel de la procédure stockée dans un curseur

Je souhaite exécuter cette procédure stockée pour différentes bases de données et différentes tables. J'ai créé un curseur pour cela.

Lorsque j'écris USE @dbname, il essaie de trouver la procédure stockée dans un nom @db et non la base de données en cours.

Quelqu'un peut-il s'il vous plaît m'aider avec comment écrire cette commande dans un curseur?

DECLARE name_cur CURSOR FOR 
    SELECT db_name, obj_name from Stats_Usage 
    WHERE last_user_update > '2011-06-01' ORDER BY db_name 
DECLARE @tableName NVARCHAR (800) 
DECLARE @dbName NVARCHAR(800) 
DECLARE @sql NVARCHAR(900) 
OPEN name_cur 
FETCH name_cur INTO @dbName, @tableName 
WHILE @@Fetch_Status = 0 
BEGIN 

SET @sql = 'USE '[email protected] +' EXEC proc_depend ' + @tableName 
EXEC (@sql) 
FETCH name_cur INTO @dbName, @tableName 
END 
CLOSE name_cur 
DEALLOCATE name_cur 
GO 

Répondre

2

Vous pouvez fully qualify votre nom de procédure stockée.

En supposant que la base de données de votre SP réside dans procs est appelé (par exemple), vous pouvez modifier votre requête pour utiliser les éléments suivants:

SET @sql = 'USE '[email protected] +' EXEC procs.dbo.proc_depend ' + @tableName 
EXEC (@sql) 
+0

Oui cela a fonctionné !! Je crée une table dans une procédure stockée que j'ai écrite. Mais quand je l'appelle à partir de la requête ci-dessus, il renvoie une erreur indiquant que la table existe déjà. Lorsque nous exécutons une procédure stockée, la table est-elle créée? Je suis confus. – CamAd

+0

Mais est-ce vraiment important pour l'exécution de la procédure quelle base de données est en cours? Je pensais que tous les objets que les références SP sont considérés être dans la même base de données que le SP, à moins qu'ils ne soient explicitement qualifiés avec un nom de base de données différent. –

1

Refactoriser votre proc stocké pour vérifier les objets dépendants base de données se croisent. Vous voulez envoyer une commande comme ceci:

exec proc_depend 'MyDatabase.dbo.MyTable'; 

Essayez ceci:

SET @sql = ' EXEC proc_depend ''' @dbName + '.dbo.'+ @tableName + '''; 

Vous aurez besoin de creuser dans & modifier proc_depend pour assurer que cela peut prendre un objet complet nom comme database.schema.table

+0

Je reçois une erreur de syntaxe pour la solution ci-dessus. – CamAd

+0

@anjali: probablement vous le feriez. Vous devrez peut-être envoyer une chaîne à votre proc. –

+0

désolé, je ne vous ai pas. – CamAd

Questions connexes