我不是在尝试将数据从一台服务器直接复制到另一台服务器。在将源数据插入目标数据库之前,我必须清理/重命名源数据,并检查各种查找表中是否存在值,如果不存在,则将其插入。
基本上是这样的:
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创建一个链接服务器。
答案 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。
这还假定您对两个框都拥有权限,但是您无需要求任何客户来完成它。