2014-09-10 75 views
1

好的,所以我有這個查詢是用來記錄存儲過程的使用情況。問題是,我使用了合併語句,它不能跨多臺服務器插入中央表。我基本上需要在每臺服務器上生成信息,然後將數據插入中央服務器的表中。任何輸入都會很好地解決這個問題。我們正在使用SQL 2008 R2。跨多個服務器合併數據

MERGE INTO [DBA].dbo.SP_Exec_Stats_Table STAT 
USING 
(
SELECT db.name as [DatabaseName] 
    ,OBJECT_NAME(d.object_id, d.database_id) [ProcedureName] 
    ,d.last_execution_time 
    ,o.modify_date 
    ,d.total_elapsed_time/d.execution_count AS [avg_elapsed_time] 
    ,d.execution_count 
    ,@@SERVERNAME as [ServerName] 
    ,d.object_id 
FROM sys.dm_exec_procedure_stats AS d inner join sys.databases as db on db.database_id = d.database_id 
    inner join sys.objects o on o.object_id = d.object_id 
WHERE d.database_id not in(1,2,3,4,5) 
) as SRC 
ON STAT.[Object_id] = SRC.Object_id 
WHEN MATCHED 
AND STAT.[Last_Exec_Time] <> SRC.last_execution_time THEN 
UPDATE SET 
    [Last_Exec_Time] = SRC.last_execution_time 
WHEN NOT MATCHED THEN 
INSERT (DatabaseName 
,object_id 
,[ProcedureName] 
,[Last_Exec_Time] 
,[Modified_Date] 
,[Avg_Elapsed_Time] 
,[Exec_Count] 
,[Server_Name] 
) 
VALUES (SRC.DatabaseName 
    ,SRC.object_id 
    ,SRC.[ProcedureName] 
    ,SRC.last_execution_time 
    ,SRC.modify_date 
    ,SRC.[Avg_Elapsed_Time] 
    ,SRC.execution_count 
    ,SRC.[ServerName] 
    ) ; 
+0

MERGE語句的目標不能是遠程表,但源很可能是遠程服務器上的表。因此,也許你可以修改你的作業從遠程服務器提取數據併合併到中央服務器 – user2321864 2014-09-10 15:09:52

+0

我甚至沒有想到要這樣做。謝謝,我重寫了我的聲明並在主機服務器上進行了設置,以查看所有其他服務器,並且它運行良好。感謝你的回答 – 2014-09-10 16:11:40

回答

0

通過重新編寫查詢從遠程服務器提取信息,並將其插入到本地服務器,我能夠繞過MERGE語句的限制。我將'從'更改爲包含遠程服務器的完全限定名稱,並能夠將數據拉入本地服務器。