将一张桌子上的数据复制到另一张桌子

将一张桌子上的数据复制到另一张桌子

问题描述:

我需要将tbl_products从系统1转移到系统2,这意味着两个系统都有相同的DB和相同的tbl_products。需要将系统1的数据库中的相同数据传送到系统2的tbl_products将一张桌子上的数据复制到另一张桌子

我曾在PostgreSQL中使用COPY方法导出和导入数据为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。

我们使用OLE自动化对象的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

在SQL Server中,您可能会在两台服务器之间建立数据库链接(这很容易,但documentation相当长)。

然后,你只需要做:

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

没有必要去通过CSV用于这一目的。

+0

+1打我几秒钟。 to @rimboche使用INSERT INTO ... SELECT如果您的目标表已经存在。 –

+1

我想你错过了我的问题的最后一行 – rimboche

+1

我想你错过了他的答案的第一行 –

虽然,戈登的回答对您的问题有效,因为它是将表从一台服务器复制到另一台的最快方法之一。但你也可以尝试一种替代方法来做同样的事情。在SSIS(SQL Server Integration Services)包中,您可以通过数据流任务在两台服务器之间传输数据,而无需建立链接的服务器连接。

如果您是SSIS的新手,那么我建议您只使用SSMS中的import-export wizard将数据从一台服务器传输到另一台服务器。如果是重复性任务,您也可以生成SSIS包。 你会看到下面的步骤上导入导出向导工作

enter image description here

TSQL解决方案

时,您可以使用OPENROWSETOPENDATASOURCE不会造成任何链接的服务器传输两个服务器之间的数据。这可能需要您提供用户名和密码。

您可以通过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,不想取决于这个UI – rimboche

+0

@rimboche我已经使用TSQL解决方案编辑了我的答案 –