我想要类似的东西:
insert into server2.database1.table1 select * from server1.database1.table1
这两个表是完全相同的。
如何 在两个服务器实例之间复制数据?
SQL-链接服务器
如果两个服务器都是SQL Server,则可以设置链接服务器-为了安全起见,我建议使用一个SQL帐户。
然后,您可以简单地执行
insert into server2.database1.dbo.table1 select * from server1.database1.dbo.table1 where col1 = 'X'
如果您在连接到server1的SQL Management Studio中运行查询,并且当前数据库设置为database1,则不需要前缀
server1.database1.dbo.
同样,链接服务器将在server1上配置为连接到server2(而不是相反)。
如果您具有正确的OLE DB驱动程序,则此方法也可以在不同类型的RDBMS(即非SQL Server的RDBMS)之间工作。
打开查询
注意:注意不要过多地依赖链接服务器,尤其是对于过滤和跨服务器的联接,因为它们要求在应用任何条件之前,必须将数据完全读取到原始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,则不需要链接的服务器。在server1上并置主机时,似乎需要重命名数据库。实现这种共址可以使用多种方法,我建议在继续执行以下任一方法之前先收缩数据库文件:
无论哪种情况,SQLServer版本都可能成为障碍。如果server1的SQL版本较低,则备份和分离/附加方法都可能会失败。可以通过将server1数据库移至server2来解决此问题,这可能更合适或更合适。
其他方法
对于先前提到的方法,如果没有有利的环境因素,则可能是合适的非SQL / TSQL方法。并且,如果您具有正确的访问权限(OLE DB驱动程序等),则此方法也可以在不同类型的RDBMS(即非SQLServer的RDBMS)和数据源(例如XML,平面文件,Excel电子表格)之间工作…)
例如。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); } }
太酷了吧?如果速度/效率是一个问题-基于SqlBulkInsert的方法(如SSIS)是最好的。
更新-修改目标表
如果您需要更新目标表,我建议您:
Such a whole process could be enhanced with a sliding window (changes since last checked), only taking recently changed rows in the source an applying to the destination, this complicates the process, so you should at least accomplish the simpler one first. After completing a sliding window version, you could run the full-update one periodically to ensure there are no errors in the sliding window.