2016-02-26 4 views
0

Мне нужно передать tbl_products из системы 1 в систему 2, что означает, что обе системы имеют одну и ту же БД и то же самое tbl_products. Нуждаются в том, чтобы получить одни и те же данные в базе данных системы 1 к системе 2's tbl_products.Скопировать данные из одной таблицы в другую

Я использовал метод COPY в PostgreSQL для экспорта и импорта данных в виде csv.

В системе 1

Copy (select * from tbl_products) to 'D:\AppFolder\DataTran\tbl_products).csv' with csv headers; 

перенося tbl_product.csv через интернет и

В системе 2

Delete from tbl_products: 
copy tbl_products from 'D:\AppFolder\DataTran\tbl_products).csv' with csv headers; 

Теперь мне нужно реализовать этот же метод, с помощью SQL Server

Примечание : Оба компьютера не являются ко nnected.

ответ

1

Мы используем OLE Automation Object писать в CSV:

DECLARE @Var as xml --or nvarchar(max) 
SELECT @Var= --some content yoy want to write in file 

DECLARE @FSO int 
DECLARE @hr int 
DECLARE @src varchar(255) 
DECLARE @desc varchar(255) 
DECLARE @oFile int 
DECLARE @filename nvarchar(max)='D:\Reports\our.csv'; 

-- Create OLE Automation Object 
EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @FSO OUT 
IF @hr <> 0 
BEGIN 
    EXEC sp_OAGetErrorInfo @FSO, @src OUT, @desc OUT 
    SELECT hr=convert(varbinary(4),@hr), [email protected], [email protected] 
    RETURN 
END 

-- Create the file 
EXEC @hr = sp_OAMethod @FSO, 'CreateTextFile', @oFile OUT, @filename, 8 , True 
IF @hr <> 0 
BEGIN 
    EXEC sp_OAGetErrorInfo @FSO, @src OUT, @desc OUT 
    SELECT hr=convert(varbinary(4),@hr), [email protected], [email protected] 
    RETURN 
END 
--Here we put content in file 
EXEC @hr = sp_OAMethod @oFile, 'Write', NULL, @Var 
IF @hr <> 0 
BEGIN 
    EXEC sp_OAGetErrorInfo @FSO, @src OUT, @desc OUT 
    SELECT hr=convert(varbinary(4),@hr), [email protected], [email protected] 
    RETURN 
END 

-- Clear used objects 
EXEC @hr = sp_OADestroy @FSO 
IF @hr <> 0 
BEGIN 
    EXEC sp_OAGetErrorInfo @FSO, @src OUT, @desc OUT 
    SELECT hr=convert(varbinary(4),@hr), [email protected], [email protected] 
    RETURN 
END 
EXEC @hr = sp_OADestroy @oFile 
IF @hr <> 0 
BEGIN 
    EXEC sp_OAGetErrorInfo @oFile, @src OUT, @desc OUT 
    SELECT hr=convert(varbinary(4),@hr), [email protected], [email protected] 
     RETURN 
END 

Так что вам просто нужно положить все таблицы в @Var или написать while цикл с приемом каждой строки и поместив его в файл, или. .. все что пожелаете.

Чтобы загрузить CSV-данные на сервере вы можете использовать:

INSERT INTO dbo.YourTable 
SELECT a.* FROM OPENROWSET(BULK 'D:\our.csv', FORMATFILE = 'D:\our.fmt') AS a; 

Образец our.fmt (это файл, который описывает поля в формате CSV)

9.0 
4 
1 SQLCHAR 0 50 ";"  1 Field1    SQL_Latin1_General_Cp437_BIN 
2 SQLCHAR 0 50 ";"  2 Field2    SQL_Latin1_General_Cp437_BIN 
3 SQLCHAR 0 50 ";"  3 Field3    SQL_Latin1_General_Cp437_BIN 
4 SQLCHAR 0 500 "\r\n"  4 Field4  SQL_Latin1_General_Cp437_BIN 

Вы можете найти описание * .fmt here.

+0

Это то, что я искал – rimboche

5

В SQL Server вы, скорее всего, настроили бы связь между двумя серверами (это легко, хотя documentation довольно длинный).

Тогда вы просто сделать:

select t.* 
into <local_table> 
from <remote_link>.<database>.<schema>.<table>; 

Там нет необходимости идти через CSV для этой цели.

+0

+1 за избиение меня на несколько секунд. @rimboche использовать INSERT INTO ... SELECT, если ваша таблица назначения уже существует. –

+1

Я думаю, вы пропустили последнюю строку в моем вопросе – rimboche

+1

Я думаю, вы пропустили первую строку своего ответа –

2

Хотя ответ Гордона действителен для вашего вопроса, так как он является одним из самых быстрых способов копирования таблицы с одного сервера на другой. Но вы также можете попробовать альтернативный подход сделать то же самое. в пакете служб SSIS (SQL Server Integration Services) вы можете передавать данные между двумя серверами через задачу потока данных без установления соединения с подключенным сервером.

Если вы новичок в SSIS, я рекомендую вам просто использовать import-export wizard в SSMS для передачи данных с одного сервера на другой. Вы также можете создать пакет SSIS, если это повторяющаяся задача. Вы увидите ниже шага во время работы на мастере экспорта импорта

enter image description here

Раствора Tsql

Вы можете использовать OPENROWSET или OPENDATASOURCE для передачи данных между двумя серверами без создания какого-либо связанный сервера. Для этого может потребоваться указать имя пользователя и пароль.

Вы можете использовать его с помощью проверки подлинности Windows,

SELECT * 
INTO YourDbName.SchemaName.TableName 
FROM OPENDATASOURCE('SQLNCLI', 'Data Source=RemoteServerName;Integrated Security=SSPI').RemoteDbName.RemoteSchemaName.RemoteTableName 

или с помощью проверки подлинности SQL

SELECT * 
INTO YourDbName.SchemaName.TableName 
FROM OPENDATASOURCE('SQLNCLI', 'Data Source=RemoteServerName;user id=username;password=password).RemoteDbName.RemoteSchemaName.RemoteTableName 

Как примечание стороны, OPENROWSET поддерживает объемную работу.

+0

Есть ли способ сделать это с помощью SQL или T-SQL, Dont хотят зависеть от этого UI – rimboche

+0

@rimboche Я отредактировал свой ответ с решением TSQL –

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