Mah*_*ari 21 sql t-sql sql-server
我想要的东西:
insert into server2.database1.table1 select * from server1.database1.table1
两个表完全相同.
如何在两个服务器实例之间复制数据?
Tod*_*odd 50
SQL - 链接服务器
如果两台服务器都是SQL Server,您可以设置链接服务器 - 我建议使用SQL帐户来保证安全性.
然后你可以简单地执行
insert into server2.database1.dbo.table1
select * from server1.database1.dbo.table1 where col1 = 'X'
Run Code Online (Sandbox Code Playgroud)
如果在连接到server1的SQL Management Studio中运行查询,并将当前数据库设置为database1,则不需要前缀
server1.database1.dbo.
Run Code Online (Sandbox Code Playgroud)
此外,链接服务器将在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''');
Run Code Online (Sandbox Code Playgroud)
上面的代码更有效,在抽取数据之前过滤源服务器上的数据(并使用可用的索引),从而节省了源服务器和目标服务器的带宽/时间/资源.
(另请注意双引号''是生成单引号的转义序列.)
SQL - 暂时在同一台服务器上
将启用(注意下划线):
insert into server2_database1.dbo.table1
select * from database1.dbo.table1
Run Code Online (Sandbox Code Playgroud)
仍在SQL查询域中.如果您可以暂时将server2上的数据库移动到server1,那么您将不需要链接服务器.在server1上共同定位时,似乎需要重命名数据库.实现这种协同定位可以使用各种方法,我建议缩小数据库文件,然后再继续:
在任何一种情况下,SQL Server版本都可能成为障碍.如果server1的SQL版本较低,则备份和分离/附加方法都可能会失败.这可以通过将server1数据库移动到server2来解决,这可能是也可能不适合.
其他方法
对于前面提到的方法,可能是合适的非SQL/TSQL方法失败的有利环境因素.如果你有正确的访问权限(OLE DB驱动程序等),这个方法也可以在不同类型的RDBMS(即非SQL Server)和数据源(如XML,flatfiles,Excel Spreadsheets)之间工作...)
例如.SQLBulkInsert(psedo-C#代码)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
很酷吧?如果速度/效率是一个问题 - 基于SqlBulkInsert的方法(如SSIS)是最好的.
更新 - 修改目标表
如果您需要更新目标表,我建议您:
这样的整个过程可以通过滑动窗口(自上次检查后的更改)得到增强,仅将源中最近更改的行应用到目标,这使得过程变得复杂,因此您至少应该首先完成更简单的过程.完成滑动窗口版本后,您可以定期运行完全更新版本以确保滑动窗口中没有错误.