INSERT INTO из двух разных баз данных сервера

Я пытаюсь скопировать данные testdabse.invoice таблицы для basecampdev.invoice таблицы. testdabse - это локальная база данных, а basecampdev - на сервере.

Мой запрос на копирование данных в другую таблицу не работает, говорится

Invalid object name 'basecampdev.dbo.invoice'.  

Я читал эту документацию, но мне трудно ее понять и понять.

Это информация, предоставленная сервером

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

Ответ 1

Похоже, вам может понадобиться создавать и запрашивать связанные серверы баз данных в 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]

Если вы не можете получить доступ к удаленному серверу, посмотрите, можете ли вы создать связанный сервер базы данных:

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

Тогда вы можете просто выполнить запрос к MyEmployee, не используя полное имя из четырех частей

Ответ 2

Ответ, данный Саймоном, отлично подходит для меня, но вы должны сделать это в правильной последовательности: сначала вы должны быть на сервере, который вы хотите вставить в данные [DATABASE.WINDOWS.NET]. [Basecampdev] в вашем дело.

Вы можете попытаться выяснить, можете ли вы выбрать некоторые данные из таблицы счетов, чтобы убедиться, что у вас есть доступ.

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

Во-вторых, выполните запрос, предоставленный Саймоном, чтобы связать его с другим сервером. На этот раз используйте другой сервер:

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.

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

Надеюсь это поможет!

Ответ 3

Вы не можете напрямую скопировать таблицу в базу данных целевого сервера из другой базы данных, если источник db не находится на ваших связанных серверах. Но одним из способов является возможность генерации сценариев (схемы с данными) нужной таблицы в одну таблицу временно в БД исходного сервера, затем выполнение сценария в БД целевого сервера для создания таблицы с вашими данными. Наконец, используйте INSERT INTO [DESTINATION_TABLE] выберите * из [TEMPORARY_SOURCE_TABLE]. После того, как данные в таблицу назначения упадут на временную.

Я нашел это решение, когда столкнулся с такой же ситуацией. Надеюсь, это тоже поможет.

Ответ 4

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. */

Ответ 5

Вы можете использовать CREATE SYNONYM для удаленного объекта.