如何将数据从一台SQL服务器上的数据库复制到另一台SQL服务器上的数据库?

时间:2019-05-01 21:02:47

标签: sql-server

我不是在尝试将数据从一台服务器直接复制到另一台服务器。在将源数据插入目标数据库之前,我必须清理/重命名源数据,并检查各种查找表中是否存在值,如果不存在,则将其插入。

基本上是这样的:

SELECT EmployeeID, FirstName, LastName, Region
INTO #Temp
FROM server1.db1.dbo.Employees

INSERT INTO server2.db2.dbo.Region
(Region)
SELECT DISTINCT Region FROM #Temp
WHERE Region NOT IN (SELECT Region FROM server2.db2.dbo.Region)

INSERT INTO server2.db2.dbo.Employees
(EmployeeID, FullName, Region)
SELECT EmployeeID, FirstName + ' ' + LastName AS FullName, Region FROM #Temp

DROP TABLE #Temp

但是,使用完全限定的名称(例如serverName.DBname.DBTable)似乎无效。

我正在使用SQL Server 2012。

编辑-我不相信我可以让客户端根据https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-addlinkedserver-transact-sql?view=sql-server-2017创建一个链接服务器。

2 个答案:

答案 0 :(得分:0)

如果您无法设置链接服务器(建议这样做),则可以使用OPENROWSET假设,您在两个实例上都拥有一个AD帐户,并具有相关权限。您还需要连接到要向其中插入数据的实例,而不是数据来自的服务器。这应该给你一个主意:

USE db2;
GO

INSERT INTO dbo.Employees (EmployeeID, FullName, Region)
SELECT EmployeeID, FirstName + ' ' + LastName AS FullName, Region
FROM OPENROWSET('SQLNCLI','SERVER=server2;Trusted_Connection=yes',
                N'SELECT EmployeeID, FirstName, LastName, Region FROM db1.dbo.Employees');

如果两者都没有AD登录,则需要使用SQL身份验证。如果那不是一个选择,那么您将不得不完全走另一条路。

答案 1 :(得分:0)

另一种选择是使用SSIS。

  1. 为每个服务器创建连接管理器
  2. 创建数据流任务。
  3. 为每个表的数据流任务添加源和目标。
  4. 将转换查询放入与源服务器连接的源中。
  5. 在连接到目标服务器的目标位置映射您的列。
  6. 执行程序包。
  7. 鲍勃是你叔叔

这还假定您对两个框都拥有权限,但是您无需要求任何客户来完成它。