2009-08-05 77 views
1

我正在使用SQL Server 2008 Enterprise。我需要將Server/Instance「Server Foo」,Database「Foo」和表「Foo」中的所有數據導入到目標服務器/實例「Server Goo」,數據庫「Goo」和表「Goo」中。 Table Foo和Table Goo具有相同的架構。如果表Goo存在同一行,我想將原始數據保存在Goo中,並在Foo中引入導入行(表Foo和表Goo都有一個名爲CustomerID的唯一標識符類型列,它充當主鍵和聚簇索引),只是像忽略重複鍵那樣。將數據從一個表導入另一個表

我正在尋找簡單可靠的方法來編寫T-SQL來解決數據導出/導入問題。任何參考樣本?

編輯1:

我曾嘗試用MERGE下面的解決方案,但遭到了SQL Server Management Studio中下面的錯誤。任何想法有什麼不對?

一些更多信息:

LabTest1 \ SQLServer2008的=>服務器\實例名; OrderDB => DB名稱; dbo =>模式名稱; Orders =>表名。

merge into [dbo].[Orders] as Target 
using "LabTest1\SQLServer2008.OrderDB.dbo.Orders" as source 
on target.Hash = source.Hash 
when not matched then 
INSERT  ([Hash] 
      ,[Order] 
      ,[Name] 
      ,[CreationTime] 
      ,[Description]) 
    VALUES 
    (
    source.[Hash], source.[Order], source.[Name], source.[CreationTime], source.[Description] 
    ) 
when MATCHED then 
; 

錯誤消息:

消息102,級別15,狀態1,行16 附近有語法錯誤 ';'。

由於事先 喬治

+1

然後只是將WHEN MATCHED THEN行全部刪除 - 如果源和目標條目匹配,則不做任何事情,對吧?您可以在這裏發佈UPDATE語句 – 2009-08-05 11:17:44

回答

8

在SQL Server 2008中,你可以在SQL Server管理工作室腳本你的Goo.Goo表,並告訴它也創建腳本中使用T-SQL插入所有數據INSERT聲明。走在對象資源管理器在數據庫上,單擊右鍵,選擇「任務>生成腳本」,選擇要生成的數據插入語句表,並確保使用此選項在這裏:

alt text http://i29.tinypic.com/37wgz.jpg

然後可以在其他服務器上運行那些插入表內容。但是,在這種情況下,您必須自己處理插入可能存在的行。另一方面,如果兩臺服務器位於同一網絡上,則可以使用「鏈接服務器」功能並將源服務器鏈接到目標服務器,然後使用SQL Server 2008 MERGE語句導入所有的數據從源srever的表格到目標服務器。

在對象資源管理器,進入「服務器對象」,然後選擇「鏈接服務器」,單擊鼠標右鍵,「添加新的鏈接服務器」建立在兩個服務器之間的連接:

alt text http://i28.tinypic.com/2hgtrew.jpg

一旦服務器被鏈接,一個簡單的MERGE語句(SQL Server 2008中新)將允許您從這兩表中的數據合併:

MERGE 
    INTO Goo.Goo as Target 
    USING Foo.Foo.dbo.Foo as Source 
    ON Source.ID = Target.ID 
WHEN NOT MATCHED THEN 
    INSERT (field1, field2, field3) 
    VALUES (source.field1, source.field2, source.field3) 
WHEN MATCHED THEN 
    -- do nothing 
; 

瞭解更多關於此新的MERGE語句:

或SQL Server 2008聯機叢書英寸

馬克

+0

感謝Marc,對於鏈接服務器,我如何填充「新鏈接服務器」嚮導中的「鏈接服務器」值?我試圖輸入機器名稱,但失敗了。 – George2 2009-08-05 09:02:20

+1

您是否在「新鏈接服務器/常規」頁面上選擇了「SQL Server」選項?只需輸入要鏈接到的SQL Server實例的名稱即可。在嚮導的其他頁面上,您可能還需要指定憑據以連接到該服務器實例 – 2009-08-05 09:23:58

1

如果您正在使用的SQL Server企業版,那麼爲什麼使用原始的T-SQL代碼,使您的項目很難爲自己?

您可以通過使用SQL Server Integration Services(SSIS),一種專門設計用於執行ETL任務的技術,並且當然包含在您的SQL Server版本中,以更簡單,更健全的方式實現目標。

預構建組件已經存在,可以按照您希望的方式處理數據,而且您還可以輕鬆地將審計和日誌記錄功能合併到您的解決方案中。

您希望通過純粹的T-SQL編碼來實現您的目標,然而您會在此過程中讓自己的生活變得更加困難,並且在我看來,最終的解決方案很可能會很麻煩並且不太優雅。

相關問題