2010-01-15 2 views

Répondre

10

Les procédures stockées sont spécifiques à la base de données. Si vous souhaitez accéder dynamiquement aux données d'une autre base de données, vous devez créer un SQL dynamique et l'exécuter.

Declare @strSQL VarChar (MAX) 
Declare @DatabaseNameParameter VarChar (100) = 'MyOtherDB' 

SET @strSQL = 'SELECT * FROM ' + @DatabaseNameParameter + '.Schema.TableName' 

Vous pouvez utiliser si des clauses pour régler le @DatabaseNameParameter à la DB de votre goût. Exécutez l'instruction pour obtenir vos résultats.

+6

Attention, il y a beaucoup de limites à cette approche. Par exemple, le SQL dynamique est dans une portée complètement différente, donc il n'a pas accès aux variables de table, tables temporaires, etc. qui sont dans votre procédure stockée. En outre, il existe de gros problèmes de sécurité potentiels. Vous devriez vérifier http://www.sommarskog.se/dynamic_sql.html avant d'utiliser cette approche. –

3

Ceci est pas SQL dynamique et travaille pour l'utilisation de SYNONYMES est une bonne stratégie procs stockées

Declare @ThreePartName varchar (1000) 
Declare @DatabaseNameParameter varchar (100) 

SET @DatabaseNameParameter = 'MyOtherDB' 

SET @ThreePartName = @DatabaseNameParameter + '.Schema.MyOtherSP' 

EXEC @ThreePartName @p1, @p2... --Look! No brackets 
14

Parfois,:

CREATE SYNONYM [schema.]name FOR [[[linkedserver.]database.]schema.]name 

Ensuite, reportez-vous à l'objet par son synonyme dans votre procédure stockée. La modification du point de synonyme est une question de SQL dynamique, mais vos procédures stockées principales peuvent être entièrement sans SQL dynamique. Créez une table pour gérer tous les objets à référencer et une procédure stockée qui permute tous les synonymes souhaités dans le bon contexte.

Cette fonctionnalité est uniquement disponible dans SQL Server 2005 et versions ultérieures.

Cette méthode ne convient PAS pour une commutation fréquente ou pour des situations où des connexions différentes doivent utiliser des bases de données différentes. Je l'utilise pour une base de données qui se déplace parfois entre les serveurs (elle peut s'exécuter dans la base de données prod ou sur la base de données de réplication et ils ont des noms différents). Après avoir restauré la base de données à sa nouvelle maison, je lance mon SP de switcheroo dessus et tout fonctionne dans environ 8 secondes.

+0

Est-il possible de créer un synonyme juste pour le nom de la base de données? Exemple: le nom de ma base de données est: MYDB_01. Puis-je créer un synonyme pour cela? – FrenkyB

+0

Non, ce n'est pas possible. Dommage, hein? – ErikE

+0

Welll. mieux que rien. Au moins, aucun SQL dynamique n'est nécessaire. Mais, chaque objet (table, vue) doit être défini séparément. – FrenkyB

Questions connexes