T-Sql

來自許多數據庫中的多個表的並集,並將結果分組為 n

  • November 26, 2019

dba中的第一篇文章,所以請溫柔。

我有一個正在處理的項目,並且有 4 個以上的 SQL Server 數據庫可供使用。

這些數據庫包含 2 個(或更多表)我希望將結果合併。

我感興趣的數據包含 Windows Server 文件路徑(SrcFilename、DestFilename 供參考),看起來像這樣:

srcfilename001.dwg|\srcServer1\path\to\file|destfilename001.dwg|\destserver\path\to\file\ srcfilename002.dwg|\srcServer2\path\to\file|destfilename002.dwg|\ destserver\path\to\file\ srcfilename003.dwg|\srcServer3\path\to\file|destfilename003.dwg|\destserver\random\path\ srcfilename004.dwg|\srcServer4\path\to\file| destfilename004.dwg|\destserver\隨機\路徑\

我已經能夠使用這樣的查詢來合併數據:

   SELECT * FROM (
SELECT * FROM [Database_015].[dbo].[CAD_DATA] Where [Database_015].[dbo].[CAD_DATA].[UniqueValue] = 1 
UNION ALL
SELECT * FROM [Database_016].[dbo].[CAD_DATA] Where [Database_016].[dbo].[CAD_DATA].[UniqueValue] = 1 
UNION ALL
SELECT * FROM [Database_017].[dbo].[CAD_DATA] Where [Database_017].[dbo].[CAD_DATA].[UniqueValue] = 1 
UNION ALL
SELECT * FROM [Database_020].[dbo].[CAD_DATA] Where [Database_020].[dbo].[CAD_DATA].[UniqueValue] = 1 
) A  
ORDER BY NEWID()

哪個效果很好…

我以隨機順序獲取所需的數據,而不是來自 \server1、\server2、\server3 等的一堆文件。

顯然,隨機性是因為ORDER BY NEWID().

收集數據的原因是因為我們正在遷移數百萬個文件,最終需要對源文件和目標文件進行雜湊處理以查看它們是否匹配。

最終,我將使用 Powershell 從結果數據中對文件進行雜湊處理,我認為將每個 PowershellStart-ThreadJob 'Job'點依次放在每個伺服器上以獲取n文件將比讓它在多個伺服器上處理數據“條帶”更快。

謝謝你的時間。:)

編輯:第一條評論要求更多解釋,所以這裡是:

我不知道如何將兩者結合起來UNION ALLGROUP BYORDER BY從多個不同的數據庫表中生成數據集,這些數據庫表具有n按伺服器以隨機順序分組的批次文件。

假設問題是…

我已經對每個伺服器進行了隨機化,但現在我需要在整個集合中進行隨機化

…那麼從您的查詢中完全刪除UNION&可能是謹慎的。ORDER BY您可以將針對所有數據庫/伺服器組合的標準查詢統一到儲存為 PSCustomObject 的單個數據集中,並將統一數據通過管道傳輸到Sort-Object使用表達式{Get-Random}在整個集合中隨機化,而不是按呼叫隱式分區。

您可以使用dbatools嘗試以下操作。

$connections = @"
Server,Database
sql-01,Database_015
sql-01,Database_016
sql-02,Database_017
sql-03,Database_020
@" | ConvertFrom-Csv

$query_tmp = @"
select 
   '{0}' as serv,
   '{1}' as db,
   SrcFilename,
   DestFilename
from dbo.CAD_DATA
where UniqueValue = 1;
"@

$table = foreach($conn in $connections){
   $query = $query_tmp -f $conn.Server, $conn.Database
   Invoke-DbaQuery -Query $query -Server $conn.Server -Database $conn.Database
}

$table | Sort-Object {Get-Random} | Export-Csv ~/Desktop/myquery.csv

如果您無權訪問/無法使用 dbatools,您可以使用 dbatoolsInvoke-SqlCmd代替Invoke-DbaQuery

引用自:https://dba.stackexchange.com/questions/254148