2012-05-15 40 views
0

我有10個相同的數據庫。從不同數據庫獲取行的最佳方式是什麼?

我在運行時獲取數據庫名稱。

我想將行存儲到對象集合中。

我也只想在數據庫服務器上一擊。

我目前的做法: -

  • 在查詢(X無緣無故的存儲過程)我得到了一個臨時表的數據庫和存儲列表。
  • 然後我遍歷每個數據庫並創建一個動態查詢並執行它。

    DECLARE @MaxRownum int SET @MaxRownum = (SELECT MAX(RowNum) FROM #Databases) 
    DECLARE @Iter int SET @Iter = 1 
    WHILE @Iter <= @MaxRownum 
    BEGIN 
    DECLARE @Database varchar(255) SELECT @Database = Databases FROM #Databases 
         WHERE RowNum = @Iter 
    IF HAS_DBACCESS(@Database) > 0 
        BEGIN 
         //appending query 
    END 
    SET @Iter = @Iter + 1 
    END 
    EXEC(@Query) 
    

我可以使用LINQ +實體框架,一重擊服務器,沒有動態查詢和不妨礙性能?有沒有更好的解決方案?

+0

什麼是#temp表中的列?你能解釋'@Database(Databases)'和'@DatabaseName(Name)'之間的區別嗎?你對每個數據庫運行的實際查詢是什麼?你能解釋沒有存儲過程背後的原因嗎? –

+0

謝謝。 #temp表是#Databases並具有數據庫列表。 sry我刪除了@databasename它不是必需的。我正在使用SELECT在2個表上使用連接。我不能使用存儲過程,因爲我必須對所有耗時的用戶執行訪問權限......謝謝 – om471987

+0

在單個存儲過程中授予用戶執行權限比在所有10中爲這個表提供顯式選擇權耗費更多的時間數據庫?那很有意思。 :-) –

回答

1

不知道你的查詢是什麼(我問,但你沒有提供它),並不確定你知道如果沒有「動態查詢」提供數據庫名稱作爲變量是非常困難的,這裏是一個更簡單的方法來做到這一點恕我直言:

DECLARE @sql NVARCHAR(MAX); 

SELECT @sql = N''; 

SELECT @sql = @sql + CHAR(13) + CHAR(10) + 'UNION ALL' 
    --// you will need to fill in your "//appending query" stuff here: 
    + ' SELECT ... FROM ' + QUOTENAME(Databases) + '.dbo.tablename' 
FROM #Databases 
WHERE HAS_DBACCESS(Databases) = 1; 

SET @sql = STUFF(@sql, 1, 9, ''); 

EXEC sp_executesql @sql; 
相關問題