2012-12-22 37 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

相关问题