2013-06-10 1 views
4

J'ai plusieurs bases de données. Puis-je cliquer sur l'une des bases de données en fonction d'un identifiant qui est dynamique? par exemple. J'ai trois bases de données DB1,DB2,DB3. J'ai une requête select * from tblEmployees (cette table est présente dans les trois DB). J'ai un identifiant (ou une variable) dont la valeur peut être 1 ou 2 ou 3 et basé sur la valeur de cette variable que je reçois dynamiquement quand mon service est touché, je voudrais choisir le DB à partir duquel les valeurs devraient être obtenues .SQL Server - Je souhaite sélectionner la base de données en fonction d'un identifiant utilisé

Est-ce que cela peut être fait? Ma base de données est SQL Server et l'extrémité avant est asp.net. Mes chaînes de connexion sont stockées dans le fichier web.config. Puis-je avoir plusieurs chaînes de connexion qui auront le même serveur avec des noms diff DB et sélectionner l'un d'entre eux en fonction de l'identifiant.

+0

Vous devez créer la chaîne de connexion de manière dynamique à chaque fois. –

+0

essayez avec ce exec ('select * from' + @identifier + '. TblEmployees') –

Répondre

2

1.In réel Worl d la plupart du temps, vous devez stocker vos chaînes de connexion dans votre fichier web.config. donc là, vous pouvez garder trois chaînes de connexion qui auront le même serveur mais le nom des bases de données différentes, alors vous pouvez sélectionner l'une des chaînes de connexion pour la connexion de votre application à la base de données requise.

2.Vous pouvez créer cette chaîne de connexion à l'exécution si vous en avez besoin.En utilisant cette technique, vous n'aurez jamais à écrire 2 requêtes ou plus juste changer la chaîne de requête et vos requêtes fonctionneront pour toutes les bases de données.

+0

Ceci est assez proche de ma réponse. Je serais si heureux si vous pouvez s'il vous plaît me donner un exemple. – user2469939

+0

Terminé. J'ai ajouté plusieurs chaînes de connexion. Maintenant, comment puis-je sélectionner l'un d'entre eux en fonction de mes besoins de façon dynamique? – user2469939

+0

chaîne connectionstring = System.Configuration.ConfigurationManager.AppSettings ["ConnectionStringName"]; –

0

Vous pouvez faire comme ce

if(val == 1) 
{ 
    select * from [DB1].[dbo].[tblEmployees] 
} 
else if(val == 2) 
{ 
    select * from [DB2].[dbo].[tblEmployees] 
} 
+0

Merci Rajeev. J'ai en fait une procédure stockée dans deux DB différents. Je veux appeler le proc en fonction de cette valeur. Cela peut-il être fait? – user2469939

+0

vous devez modifier votre chaîne de connexion en conséquence pour cela si vous voulez faire cela dans C# –

0

Essayez celui -

DECLARE @ID INT 
SELECT @ID = 2 

DECLARE @SQL NVARCHAR(500) 
SELECT @SQL = 'SELECT * FROM DB' + CAST(@ID AS CHAR(1)) + '.dbo.tblEmployees' 

PRINT @SQL 
EXEC sys.sp_executesql @SQL 

Sortie -

SELECT * FROM DB2.dbo.tblEmployees 
0

chemin T-SQL:

declare @db int 


if @db = 1 
begin 

    use [db1] 
    select * 
    from tblEmployees 

end 

if @db = 2 
begin 
    use [db2] 
    select * 
    from tblEmployees 
end 

-- and so on 
0

IMO que vous feriez mieux d'utiliser une chaîne de connexion différente pour atteindre le multi-tenency contre des bases de données semblables. Idéalement, abstraire derrière un code afin que la plupart de votre code n'a pas besoin de savoir à ce sujet, mais ne vient:

using(var conn = Somewhere.GetOpenConnection()) { 
    // ... 
} 

ou pire cas:

using(var conn = Somewhere.GetOpenConnection(Environment.Published)) { 
    // ... 
} 

(ici Environment est enum à ce que représentent les différentes bases de données)

GetOpenConnection trouve la base de données nécessaire et recherche la chaîne de connexion correcte.

Mais pour être précis:

  • vous ne pouvez pas paramétrer le nom DB dans une requête
  • utilisant use entre les opérations serait une très mauvaise idée en termes de réutilisation de connexion
  • vous pouvez explicitement utiliser des identifiants en trois parties (c.-à-DB1..SomeTable ou DB1.dbo.SomeTable), mais cela ne redimensionne pas l'naturellement à beaucoup de bases de données
Questions connexes