2015-10-27 5 views
0

У меня проблема, я использую SQL Server 2014. Мне нужно скопировать данные из локальной таблицы в идентичную таблицу на удаленном сервере. Прямо сейчас я могу вставлять статические данные в удаленную таблицу, выбирать данные из удаленной таблицы, но я не мог делать то, что хочу.Вставить данные в таблицу удаленной базы данных из таблицы локальной базы данных

Вот мой код SQL

IF OBJECT_ID('tempdb..##TempTable') IS NOT NULL 
    DROP TABLE ##TempTable 

CREATE TABLE ##TempTable 
(
    [Name] [nvarchar](255) NOT NULL, 
    [Description] [nvarchar](512) NOT NULL, 
    [ARXUrl] [nvarchar](1000) NOT NULL, 
    [IsDeleted] [bit] NULL, 
    [CreatedDate] [datetime] NOT NULL 
); 
GO 

INSERT INTO ##TempTable 
    SELECT 
     [Name], [Description], [ARXUrl], [IsDeleted], [CreatedDate] 
    FROM [dbo].[ARXSystem] 
GO 

-- destination database 
:SETVAR remoteDB [slic-test] 
:CONNECT someserver.net\SQLEXPRESS2014 -U user -P password 
--source database 
USE [SLIC] 
GO 

SELECT * 
FROM ##TempTable; 

INSERT INTO $(remoteDB).[dbo].[ARXSystem] 
    SELECT * 
    FROM #TempTable 
GO 

и вот сообщение, которое я получил

(1 строка (s) пострадавших)
Подключение к someserver.net \ SQLEXPRESS2014 в SLIC ...
Msg 208, уровень 16, состояние 0, строка 22
Недопустимое имя объекта '## TempTable'.
Отсоединения соединения с someserver.net \ SQLEXPRESS2014 в SLIC ...

+0

Вы пытаетесь выбрать данные из временной таблицы в пункте назначения перед вами создайте эту таблицу. Сначала вам нужно создать таблицу и вставить данные. Временные таблицы не сохраняются. Кроме того, у вашего последнего выбора отсутствует # –

+0

его даже не временная таблица. Используемая инструкция заключается в создании таблицы permenant – Takarii

+0

@Takarii Как постоянная глобальная таблица temp? Они видны всем и удаляются, когда все связанные с ними соединения закрыты. Но в этом случае я не вижу необходимости в глобальной таблице temp, просто используйте регулярную временную таблицу. –

ответ

3

Вы должны использовать удаленный сервер с помощью OpenQuery или OpenRowset , что может потребовать изменения конфигурации сервера в исходной системе, где выполняется запрос. Для того, чтобы передать данные от источника к целевому запросу будет выглядеть следующим образом:

INSERT INTO OPENROWSET('SQLNCLI', 
'Server=someserver.net\SQLEXPRESS2014;User=xxxx;Password=xxxx;', 
'SELECT [Name], [Description], [ARXUrl], [IsDeleted], [CreatedDate] 
FROM [slic-test].[dbo].[ARXSystem]') 
SELECT [Name], [Description], [ARXUrl], [IsDeleted], [CreatedDate] 
FROM [dbo].[ARXSystem] 

OPENROWSET документацию можно найти здесь: https://msdn.microsoft.com/en-us/library/ms190312.aspx

+0

Кажется, он работает с простым примером. Большое спасибо. – Sanprof

-1

Вашего SQL Создает таблицу, но не временная таблица. Он создаст его в активной базе данных. Вы должны использовать что-то вроде

DECLARE @temptable TABLE 
    (
    [Name] [nvarchar](255) NOT NULL, 
    [Description] [nvarchar](512) NOT NULL, 
    [ARXUrl] [nvarchar](1000) NOT NULL, 
    [IsDeleted] [bit] NULL, 
    [CreatedDate] [datetime] NOT NULL 
    ) 

Затем после того, как ваши базы данных коммутатора вы можете обратиться к этой таблице, используя

INSERT INTO $(remoteDB).[dbo].[ARXSystem] 
      SELECT * FROM @temptable 
GO 

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

Смежные вопросы