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 для удаленного объекта.