我需要将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
实现相同的方法注意:两台计算机均未连接。
答案 0 :(得分:5)
答案 1 :(得分:2)
尽管如此,Gordon的回答对您的问题有效,因为它是将表从一台服务器复制到另一台服务器的最快方法之一。但是你也可以尝试另一种方法来做同样的事情。在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支持批量操作。
答案 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的说明。