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

时间:2013-01-04 08:32:12

标签: sql sql-server openrowset

我正在尝试将testdabse.invoice表的数据复制到basecampdev.invoice表。 testdabse是本地数据库,而basecampdev在服务器中。

我将查询数据复制到另一个表是不行的,它说

Invalid object name 'basecampdev.dbo.invoice'.  

我一直在阅读documentation,但发现很难理解和理解。

这些是服务器提供的信息

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

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

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]

屏幕截图

enter image description here

5 个答案:

答案 0 :(得分:16)

听起来你可能需要create and query linked database servers in SQL Server

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

修改
现有查询的四部分命名如下所示(我怀疑您可能已经尝试了?),但这假设您可以使用四部分名称“到达”远程数据库,您可能需要编辑主机文件/注册服务器或以其他方式识别查找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]

如果您无法访问远程服务器,请查看是否可以创建this post on four part naming

EXEC sp_addlinkedserver [database.windows.net];
GO
USE tempdb;
GO
CREATE SYNONYM MyInvoice FOR 
    [database.windows.net].basecampdev.dbo.invoice;
GO

然后,您只需查询MyEmployee,而无需完整的四部分名称

答案 1 :(得分:3)

Simon给出的答案对我来说很好,但你必须按照正确的顺序进行: 首先,您必须在要插入数据的服务器中,[DATABASE.WINDOWS.NET]。[basecampdev]在您的情况下。

您可以尝试查看是否可以从“发票”表中选择一些数据,以确保您有权访问。

Select top 10 * from [DATABASE.WINDOWS.NET].[basecampdev].[dbo].[invoice]

其次,执行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

现在只需执行插入语句。

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

希望这有帮助!

答案 2 :(得分:2)

如果源数据库不在链接服务器中,则无法直接从其他数据库将表复制到目标服务器数据库。 但有一种方法是,可以在源服务器数据库中临时生成所需表的脚本(带有数据的模式)到一个表中,然后在目标服务器数据库中执行脚本以创建包含数据的表。最后使用INSERT INTO [DESTINATION_TABLE]从[TEMPORARY_SOURCE_TABLE]中选择*。 将数据导入目标表后删除临时数据。

当我遇到同样的情况时,我找到了这个解决方案。希望这对你也有帮助。

答案 3 :(得分:1)

USE [mydb1]

SELECT *
INTO mytable1
FROM OPENDATASOURCE (
        'SQLNCLI'
        ,'Data Source=XXX.XX.XX.XXX;Initial Catalog=mydb2;User ID=XXX;Password=XXXX'
        ).[mydb2].dbo.mytable2
    /*  steps - 
            1-  [mydb1] means our opend connection database 
            2-  mytable1 means create copy table in mydb1 database where we want insert record
            3-  XXX.XX.XX.XXX - another server name.
            4-  mydb2 another server database.
            5-  write User id and Password of another server credential
            6-  mytable2 is another server table where u fetch record from it. */

答案 4 :(得分:0)

您可以将CREATE SYNONYM用于远程对象。