将一个表上的数据复制到另一个表

时间:2016-02-26 12:11:00

标签: sql sql-server sql-server-2008

我需要将tbl_products从系统1转移到系统2,这意味着两个系统都有相同的数据库和相同的tbl_products。需要在系统1的数据库中获取相同的数据到系统2的{{1} }。

我曾在PostgreSQL中使用COPY方法将数据导出和导入为csv。

在系统1中

tbl_products

通过互联网传输Copy (select * from tbl_products) to 'D:\AppFolder\DataTran\tbl_products).csv' with csv headers;

在系统2中

tbl_product.csv

现在我需要使用SQL Server

实现相同的方法

注意:两台计算机均未连接。

3 个答案:

答案 0 :(得分:5)

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

然后,你只需:

lock_guard

没有必要为此目的使用CSV。

答案 1 :(得分:2)

尽管如此,Gordon的回答对您的问题有效,因为它是将表从一台服务器复制到另一台服务器的最快方法之一。但是你也可以尝试另一种方法来做同样的事情。在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支持批量操作。

答案 2 :(得分: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), Source=@src, Description=@desc
    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), Source=@src, Description=@desc
    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), Source=@src, Description=@desc
    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), Source=@src, Description=@desc
    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), Source=@src, Description=@desc
        RETURN
END

所以你只需要将所有表放在@Var中,或者写一个while循环,然后将每个字符串放入文件中,或者......你想要的任何内容。

要在服务器上加载csv-data,您可以使用:

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的说明。