2009-12-09 2 views
0

J'ai un serveur SQL qui contient plusieurs bases de données. J'ai une base de données principale qui contient plusieurs tables avec des entités et des numéros d'identification. Ensuite, chacune de ces entités a une base de données corrélative (pas une table, mais une base de données) avec toutes ses informations. Par exemple, si une entité de la base de données MAIN a un numéro d'ID de 1, il y aura une base de données SubDatabase1 sur le même serveur SQL. Essentiellement, ce que j'essaie de faire est de créer une procédure stockée dans la base de données MAIN, qui recueille des données de la base de données SUB, mais la base de données SUB que je recueille doit être déterminée en fonction du numéro d'identification. Je sais que c'est totalement incorrect, mais je me demande si quelqu'un peut faire la lumière sur ce point pour moi.Source de données dynamique dans SQL Server stockée Procudure

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE GetInstallationCount 
-- Add the parameters for the stored procedure here 
@installId int=0 
AS 
BEGIN 
    SET NOCOUNT ON; 

    //Trying to make the DatabaseName dynamic here!! 
    select count(*) from [email protected] 

END 
GO 

Merci - J

Répondre

1

Lisez sur comment create dynamic SQL, en particulier sp_executesql. Cela devrait vous aider à démarrer:

DECLARE @theSql varchar(1000) 
DECLARE @installId int 
SET @installId = 1 
SET @theSql = 'SELECT COUNT(*) FROM dbo.Installation' + CAST(@installId as nvarchar) + '.Names' 
EXEC (@theSql) 
+0

Ok, je pensais que quelque chose comme ça était le cas, mais pour la vie de moi je ne pouvais pas comprendre Merci – Dutchie432

+0

Oh, et c'était installationXXXXX.dbo.Names, dbo.installationXXXXX.Names. Tous ces différents langages de programmation ne rentrent pas tout à coup dans mon cerveau. – Dutchie432

0

Vous devez utiliser SQL dynamique pour le faire. Les noms de tables et les noms de bases de données ne peuvent pas être résolus à l'exécution d'une autre manière.

Here is a good introduction par Scott Mitchell.

0

On pourrait faire cela en construisant dynamiquement la chaîne de sélection et en l'exécutant, mais ce serait méchant.

Vous pourriez devenir très flashy et essayer de créer des synonymes de la mouche, les utiliser dans les requêtes, puis les laisser tomber mais je ne suis pas sûr que ça en vaudrait la peine.

0

Comme souvent, la réponse à une telle question est SQL dynamique:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE GetInstallationCount 
-- Add the parameters for the stored procedure here 
@installId int=0 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @sql nvarchar(MAX) 

    SET @sql = 'select count(*) from dbo.Installation' + Cast(@installId as nvarchar) + '.Names' 
    EXECUTE dbo.sp_executesql @sql 

END 
GO 
0

Utiliser des synonymes. Par exemple, ceci définit le synonyme dbo.MySpecialTable pour pointer vers la table dbo.SomeTable dans la base de données DB_3.

IF object_id(N'SN', N'dbo.MySpecialTable') IS NOT NULL 
     DROP SYNONYM dbo.MySpecialTable 
CREATE SYNONYM dbo.MySpecialTable FOR [DB_3].[dbo].[SomeTable] 

Avec cela en place, écrivez toutes vos requêtes pour utiliser des synonymes au lieu de vrais noms de tables. Les synonymes ont une portée DB, donc gérer la "commutation de cible" à un endroit, peut-être dans une procédure stockée.

Questions connexes