2009-12-09 52 views
0

我有一個容納多個數據庫的SQL Server。我有一個主數據庫,它包含多個帶有實體和ID號碼的表格。然後,這些實體中的每一個都具有相關數據庫(不是表格,而是數據庫)及其所有信息。例如,如果MAIN數據庫中的實體的ID號爲1,則同一SQL Server上會有一個SubDatabase1數據庫。SQL Server存儲過程中的動態數據源

本質上,我試圖做的是在MAIN數據庫中創建一個存儲過程,它從SUB數據庫收集數據,但是我收集的SUB數據庫應該根據傳遞給Proc的ID號來確定。

我知道這完全不正確,但我想知道是否有人能爲我發光。

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 

謝謝 - J

回答

1

請閱讀如何create dynamic SQL,尤其是sp_executesql。這應該讓你開始:

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

好吧,我想到了這樣的情況,但對於我的生活,我無法弄清楚謝謝 – Dutchie432 2009-12-09 15:25:23

+0

哦,它是installationXXXXX.dbo.Names,dbo.installationXXXXX.Names。所有這些不同的編程語言都不能立刻融入我的大腦。 – Dutchie432 2009-12-09 15:32:04

0

你必須使用動態SQL來做到這一點。表名和數據庫名稱不能在運行時以任何其他方式解析。

Here is a good introduction斯科特米切爾的這種技術。

0

肯定可以通過動態建立的選擇字符串,並執行完成,但它會是很討厭。

你可能會非常華麗,嘗試創建飛行的同義詞,在查詢中使用它們,然後放下它們,但我不確定它是否值得。

0

由於經常,回答這樣的問題是動態SQL:

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

使用同義詞。例如,將同義詞dbo.MySpecialTable設置爲指向數據庫DB_3中的表dbo.SomeTable。

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

有了這個,寫下所有的查詢來使用同義詞而不是真正的表名。同義詞有DB範圍,因此可以在一個地方管理「目標切換」,也許在存儲過程中。