2012-12-22 68 views

回答

43

SQL - 鏈接服務器

如果兩個服務器的SQL Server,你可以設置Linked servers - 我會建議使用SQL帳戶來保證安全。

然後,你可以簡單地執行

insert into server2.database1.dbo.table1 
select * from server1.database1.dbo.table1 where col1 = 'X' 

如果您在連接到server1 SQL Management Studio中,和當前的數據庫設置爲數據庫1查詢,您將不再需要前綴

server1.database1.dbo. 

另外,鏈接服務器將在server1上配置,以連接到server2(而不是其他方式)。

如果您具有正確的OLE DB驅動程序,則此方法也可以在不同類型的RDBMS(即非SQL Server服務器)之間工作。

打開查詢

注意:當心不要依賴於鏈接服務器太多特別適用於過濾,並加入跨服務器,因爲它們需要在全給始發RDBMS之前的任何條件來讀取數據應用。鏈接服務器可能會產生許多複雜問題,因此在開始之前請仔細閱讀,因爲偶數版本的差異可能會導致麻煩。

我建議您使用SQL Server的OPENQUERY命令來解決這些限制。這裏有一個例子,但你應該通過進一步的研究發現您的具體需要的幫助:

insert into server2.database1.dbo.table1 
select * from OPENQUERY(server1, 'select * from database1.dbo.table1 where col1 = ''X'''); 

上面的代碼更有效,過濾數據源服務器上(使用可用的索引),通過抽數據之前,節省源服務器和目標服務器的帶寬/時間/資源。

(還要注意雙引號「」,是產生一個單引號的轉義序列。)

SQL - 暫時在同一臺服務器

將使(注意下劃線)上:

insert into server2_database1.dbo.table1 
select * from database1.dbo.table1 

仍在SQL查詢域中。如果您可以臨時將server2上的數據庫移動到server1,那麼您將不需要鏈接的服務器。在服務器1上共同定位時,似乎需要重命名數據庫。在server2備份,在server1還原(具有不同的名稱) - -

  1. 備份/恢復如上所述執行插入:實現這樣的共定位可以使用各種方法,我建議用在繼續之前收縮數據庫文件或者,但沒有server1或server2前綴。然後在服務器1上反向備份,在服務器2上恢復,在服務器2上恢復(壓縮),將文件複製到服務器1,(解壓縮),在服務器1上附加,執行插入。然後反向...

無論哪種情況,SQL Server版本都可能成爲障礙。如果server1的SQL版本較低,則備份和分離/附加方法可能會失敗。這可以通過將server1數據庫移到server2來解決,server2可能更適合,也可能不適合。

其他方法

是合適的,非SQL/TSQL方法未能爲前面提到的方法有利的環境因素。如果您有正確的訪問權限(OLE DB驅動程序等),則此方法也可以在不同類型的RDBMS(即非SQL Server服務器)和數據源(如XML,平面文件,Excel電子表格...)

  • SSIS明確地業務開發管理工作室 - 直接數據泵或使用分隔的文件intermeditary。
  • SSIS隱含通過SQL Management Studio中,通過右鍵單擊數據庫1在server1>任務>導出,然後完成嚮導。可以直接工作到server2,或使用平面文件intermeditary。
  • .NET編程SqlBulkInsert(我相信SSIS數據泵使用這樣的對象),我可以進入更詳細的關於這一點,如果您有興趣。

例如,SQLBulkInsert(psedo-C#code)

SqlConnection c = new SqlConnection("connectionStringForServer1Database1Here"); 
SqlConnection c2 = new SqlConnection("connectionStringForServer2Database1Here"); 
c.Open(); 
SqlCommand cm = new SqlCommand(c); 
cm.CommandText = "select * from table1;"; 
using (SqlDataReader reader = cm.ExecuteReader()) 
{ 
    using (SqlBulkInsert bc = new SqlBulkInsert(c)) 
    { 
     c2.Open(); 
     bc.DestinationTable = "table1"; 
     bc.WriteToServer(reader); 
    } 
} 

很酷很棒吧?如果速度/效率是一個問題 - 基於SqlBulkInsert的方法(如SSIS)是最好的。

更新 - 修改目標表

如果您需要更新目標表,我建議你:

  1. 寫入到目標數據庫的臨時表(臨時表,或者在進程之前和之後截斷的適當表),後者是可取的。如果您沒有CREATE TABLE權限,前者可能是您唯一的選擇。您可以使用上述任何一個選項執行傳輸。
  2. 按照您的要求從暫存表到目標表運行MERGE INTO命令。這可以根據需要非常高效地插入,更新和刪除。

這樣的整個過程可以用一個滑動窗口來增強(自上次修改選中),僅考慮在應用到目的地的源最近更改的行,這個過程複雜,所以你應該至少完成首先比較簡單。完成滑動窗口版本後,您可以定期運行完整更新版本,以確保滑動窗口中沒有錯誤。

+1

感謝您提及跨鏈接服務器加入問題。即使沒有在JOIN中使用,鏈接服務器上的DML仍然存在問題,這可能會讓事情變慢。 +1。此外,關於通過SQLCLR使用'SqlBulkInsert',如果有人想這樣做但不知道如何完成它,或者只是不想花時間在其上,[SQL#]的免費版本(http ://www.SQLsharp.com/)庫(我是該作者的)包含一個存儲過程** DB_BulkCopy **,它可以完成這些操作並顯示大部分選項(例如BulkCopyOptions,列映射,批量大小等)。 –

+1

@srutzky我喜歡使用SQL Server Managment Studio的導入/導出數據功能執行一次性任務,並且任何大於Express的版本都可以將這些過程另存爲SSIS腳本以進行編輯/重用。 SQL#看起來很方便,有一天我會嘗試一下。 – Todd

8

兩個不同的服務器之間複製數據,您有幾種選擇:

+0

我不是故意的順序,我知道這是'插入[,,,] ...選擇[,,,]從...'我的意思是如何將兩個之間複製數據服務器。 –

+0

@mahditahsildari:您可以使用鏈接的服務器。 –

1

做到這將是創建一個 「鏈接服務器」 最好的辦法。 然後你就可以使用下面的語句到您的插入語句,以確定你的表

[linkedserver].databasename.dbo.tablename 
3

託德C#SqlBulkCopy的

類似一般來說,這比創建鏈接的服務器更容易。

創建一個單元測試並運行下面的代碼,如果你有觸發器,那麼要小心,你需要ALTER權限。

[Test] 
    public void BulkCopy() 
    { 
     var fromConnectionString = @"fromConnectionString"; 
     var destinationConnectionString = @"destConnectionString2"; 

     using (var testConnection = new SqlConnection(fromConnectionString)) 
     { 
      testConnection.Open(); 
      var command = new SqlCommand("select * from MyTable;", testConnection); 
      using (var reader = command.ExecuteReader()) 
      { 
       using (var destinationConnection = new SqlConnection(destinationConnectionString)) 
       { 
        using (var bc = new SqlBulkCopy(destinationConnection)) 
        { 
         destinationConnection.Open(); 
         bc.DestinationTableName = "dbo.MyTable"; 
         bc.WriteToServer(reader); 
        } 
       } 
      } 
     } 
    } 
} 
0

首先您需要添加服務器 例如,服務器1和服務器2

sp_addlinkedserver 'Server-2'

然後從服務器到服務器,通過使用下面的查詢

在服務器1寫

select * INTO Employee_Master_bkp 
FROM [Server-2].[DB_Live].[dbo].[Employee_Master] 
0

複製您的數據。如果您需要在沒有替代使用鏈接服務器,我最喜歡的選擇是使用命令行BCP實用程序。 使用此批量複製工具,您可以將數據導出到平面文件,通過網絡複製文件並將其導入(加載)到目標服務器上。

https://docs.microsoft.com/en-us/sql/tools/bcp-utility

相關問題