2012-04-10 59 views
0

我需要從多個數據庫中獲取具有相同模式的表的數據。爲此,我在其中一個數據庫中創建了這些表的同義詞。數據庫的數量將隨着時間而增長。所以,抓取數據的過程應該是靈活的。我寫了下面的代碼片段來解決問題:將EXEC語句傳遞給APPLY作爲參數

WHILE @i < @count 
BEGIN 
    SELECT @synonymName = [Name] 
    FROM Synonyms 
    WHERE [ID] = @i 
     SELECT @sql = 'SELECT TOP (1) * 
       FROM [dbo].[synonym' + @synonymName + '] as syn 
       WHERE [syn].[Id] = tr.[Id] 
       ORDER BY [syn].[System.ChangedDate] DESC' 

     INSERT INTO @tmp 
     SELECT col1, col2 
     FROM 
     (
      SELECT * FROM TableThatHasRelatedDataFromAllTheSynonyms 
      WHERE [Date] > @dateFrom 
     ) AS tr   
     OUTER APPLY (EXEC(@sql)) result 

    SET @i = @i + 1 
END 

我也很欣賞,瞭解如何簡化解決方案的任何想法。

回答

0

我的解決方案很簡單。只需將所有查詢放入字符串並執行它即可。不幸的是,它的工作速度比複製/過去所有同義詞的代碼慢3倍。

WHILE @i < @count 
BEGIN 
    SELECT @synonymName = [Name] 
    FROM Synonyms 
    WHERE [ID] = @i 
     SELECT @sql = 'SELECT col1, col2 
     FROM 
     (
      SELECT * FROM TableThatHasRelatedDataFromAllTheSynonyms 
      WHERE [Date] > ''' + @dateFrom + ''' 
     ) AS tr   
     OUTER APPLY (SELECT TOP (1) * 
       FROM [dbo].[synonym' + @synonymName + '] as syn 
       WHERE [syn].[Id] = tr.[Id] 
       ORDER BY [syn].[System.ChangedDate] DESC) result' 

     INSERT INTO @tmp 
     EXEC(@sql) 

    SET @i = @i + 1 
END 
1

實際上,最好將所有表中的數據導入到一個表中(可能需要額外的源表名稱列)並使用它。導入可以通過SP或SSIS包來執行。

關於最初的問題 - 你可以通過TVF包裝執行exec語句(使用exec ..進入其中)來實現它。

UPD:正如在註釋中注意到,exec在TVF內部不起作用。所以,如果你真的不想要更改數據庫結構,你需要使用大量的表,我建議:

  1. 或從同義詞選擇所有數據表***到變量(如我看你選擇只有一行)並使用它們
  2. 或者爲完整語句(使用插入等)準備動態SQL,並在此使用臨時表而不是表變量。
+0

我會試試看,明天希望它能幫助我。你能給出更多關於「SP或SSIS」的細節嗎?其實我沒有明白你的意思。不幸的是,我無法將所有表格合併爲一個,因爲它們足夠大。 (SELECT * FROM Table1) - 使用Intel Xeon處理器和12 Gb RAM的服務器上的查詢需要30到60秒,並且我有多個表。使用「外部應用」查詢需要2-3秒的時間 – 2012-04-10 17:54:49

+0

SP - 存儲過程。 SSIS - SQL Server集成服務。 TVF - 表值函數。 – oryol 2012-04-11 08:42:11

+0

我試圖將查詢提取到TVF中時遇到了另一個問題:在函數中無效使用副作用運算符'EXECUTE STRING'。 – 2012-04-12 07:09:58

相關問題