将一张桌子上的数据复制到另一张桌子
我需要将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。
在SQL Server中,您可能会在两台服务器之间建立数据库链接(这很容易,但documentation相当长)。
然后,你只需要做:
select t.*
into <local_table>
from <remote_link>.<database>.<schema>.<table>;
没有必要去通过CSV用于这一目的。
+1打我几秒钟。 to @rimboche使用INSERT INTO ... SELECT如果您的目标表已经存在。 –
我想你错过了我的问题的最后一行 – rimboche
我想你错过了他的答案的第一行 –
虽然,戈登的回答对您的问题有效,因为它是将表从一台服务器复制到另一台的最快方法之一。但你也可以尝试一种替代方法来做同样的事情。在SSIS(SQL Server Integration Services)包中,您可以通过数据流任务在两台服务器之间传输数据,而无需建立链接的服务器连接。
如果您是SSIS的新手,那么我建议您只使用SSMS中的import-export wizard将数据从一台服务器传输到另一台服务器。如果是重复性任务,您也可以生成SSIS包。 你会看到下面的步骤上导入导出向导工作
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支持批量操作。
有没有办法使用SQL或T-SQL,不想取决于这个UI – rimboche
@rimboche我已经使用TSQL解决方案编辑了我的答案 –
这是我一直在寻找 – rimboche