从两个不同的服务器数据库INSERT INTO

fib*_*ics 19 sql sql-server openrowset

我试图将testdabse.invoice表的数据复制到basecampdev.invoice表. testdabsebasecampdev在服务器中的本地数据库.

它说,我将数据复制到另一个表的查询不起作用

Invalid object name 'basecampdev.dbo.invoice'.  
Run Code Online (Sandbox Code Playgroud)

我一直在阅读这个文档,但发现很难理解和理解.

这些是从服务器给出的信息

Server type: Database Engine
Server name: server.database.windows.net (this is not the real name)
Authentication: SQL Server Authentication
Login: myusername
Password: mypassword  
Run Code Online (Sandbox Code Playgroud)

如何连接到服务器以便我能够运行此查询

INSERT INTO [basecampdev].[dbo].[invoice]
           ([InvoiceNumber]
           ,[TotalAmount]
           ,[IsActive]
           ,[CreatedBy]
           ,[UpdatedBy]
           ,[CreatedDate]
           ,[UpdatedDate]
           ,[Remarks])
SELECT [InvoiceNumber]
           ,[TotalAmount]
           ,[IsActive]
           ,[CreatedBy]
           ,[UpdatedBy]
           ,[CreatedDate]
           ,[UpdatedDate]
           ,[Remarks] FROM [testdabse].[dbo].[invoice]
Run Code Online (Sandbox Code Playgroud)

屏幕截图

在此输入图像描述

Sim*_*tin 18

听起来您可能需要在SQL Server中创建和查询链接的数据库服务器

目前,您使用3部分名称创建了在不同数据库之间进行的查询,mydatabase.dbo.mytable但您需要升级并使用4部分名称myserver.mydatabase.dbo.mytable,请参阅此帖子的四部分命名以获取更多信息

编辑
现有查询的四部分命名如下所示(我怀疑您可能已经尝试了?),但这假设您可以使用四部分名称"到达"远程数据库,您可能需要编辑主机文件/注册服务器或以其他方式识别要查找的位置database.windows.net.

INSERT INTO [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]
       ([InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks])
SELECT [InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks] FROM [BC1-PC].[testdabse].[dbo].[invoice]
Run Code Online (Sandbox Code Playgroud)

如果无法访问远程服务器,请查看是否可以创建链接数据库服务器:

EXEC sp_addlinkedserver [database.windows.net];
GO
USE tempdb;
GO
CREATE SYNONYM MyInvoice FOR 
    [database.windows.net].basecampdev.dbo.invoice;
GO
Run Code Online (Sandbox Code Playgroud)

然后你可以查询MyEmployee而不需要完整的四部分名称


小智 5

西蒙给出的答案对我来说很好,但你必须按照正确的顺序来做:首先,你必须在你想要插入数据的服务器中,其中 [DATABASE.WINDOWS.NET].[basecampdev] 在你的案件。

您可以尝试查看是否可以从 Invoice 表中选择一些数据以确保您具有访问权限。

Select top 10 * from [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]
Run Code Online (Sandbox Code Playgroud)

其次,执行 Simon 给出的查询以链接到不同的服务器。这次使用其他服务器:

EXEC sp_addlinkedserver [BC1-PC]; -- this will create a link tempdb that you can access from where you are
GO
USE tempdb;
GO
CREATE SYNONYM MyInvoice FOR 
    [BC1-PC].testdabse.dbo.invoice; -- Make a copy of the table and data that you can use
GO
Run Code Online (Sandbox Code Playgroud)

现在只需执行插入语句。

INSERT INTO [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]
       ([InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks])
SELECT [InvoiceNumber]
       ,[TotalAmount]
       ,[IsActive]
       ,[CreatedBy]
       ,[UpdatedBy]
       ,[CreatedDate]
       ,[UpdatedDate]
       ,[Remarks] FROM MyInvoice
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!


Ser*_*erg 0

您可以使用CREATE SYNONYM来远程对象。