2017-06-28 206 views
1

我有一个Web应用程序的SQL服务器数据库,我的要求是从一个源数据库读取2-3个表数据并将数据插入到目标数据库中。我的输入将是一个名称和一个ID,基于此我必须从源数据库中读取数据,并且必须验证相似的名称是否已存在于目标数据库中。我必须通过C#Windows应用程序或Web应用程序来完成此操作。将SQL Server数据从一个数据库导出到另一个数据库

到目前为止,在我的研究中,人们推荐使用SqlBulkCopy或SSIS包,我尝试使用以下代码传输一个表数据。

 using (SqlConnection connSource = new SqlConnection(csSource)) 
     using (SqlCommand cmd = connSource.CreateCommand()) 
     using (SqlBulkCopy bcp = new SqlBulkCopy(csDest)) 
     { 
      bcp.DestinationTableName = "SomeTable"; 
      cmd.CommandText = "myproc"; 
      cmd.CommandType = CommandType.StoredProcedure; 
      connSource.Open(); 
      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       bcp.WriteToServer(reader); 
      } 
     } 

我现在面临的问题是,我必须复制2点表的数据,是根据表1,表2值像ID(主键)的变化,我在SqlDataReader的更新这一点,所以为了在目标数据库中获得这个新ID,我必须先插入一个表数据,然后获取ID,然后在我的reader对象中更新此ID,然后再执行另一个SqlBulkCopy,这看起来不像是理想的方式做这个,有没有其他的做这个?

+1

您可以指定两个数据库是否在同一个SQL实例上? –

+0

没有不在同一个实例 – user1890098

回答

0

在源SQL实例我将创建的链接服务器引用目的地/目标SQL实例,然后我将因此创建源数据库中的存储过程:然后

USE SourceDatabase 
GO 
CREATE PROCEDURE dbo.ExportSomething 
@param1 DataType1, 
@param2 DataType2, ... 
AS 
BEGIN 

INSERT LinkedServer.DestinationDatabase.dbo.TargetTable 
SELECT ... 
FROM dbo.Table1 INNER JOIN dbo.Table2 .... 
WHERE Col1 = @param1 AND/OR ... 

END 
GO 

,最后一步是调用这客户端应用程序的存储过程

+0

我的要求是,我会从用户获取目标SQL Server连接细节,数据库名称可能是任何东西,所以我发现我可以使用sp_addlinkedserver以编程方式创建链接服务器,所以在你的回答中,我可以根据用户输入动态更改LinkedServer.DestinationDatabase部分? – user1890098

+0

您可以使用sp_add * /创建一个链接的静态,像这样/ *只有当这个存储过程可以被一次使用一次就可以执行。如果两个用户同时执行这个存储过程*,那么这个解决方案并不是最优的。相反,你可以在dinamic sql(ODS函数)中使用OPENDATASOURCE()函数([ref](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/opendatasource-transact-sql))不接受变量 - 例如@connection_string - 作为参数)。 –

0

如果上述解决方案对您没有帮助,那么您还可以尝试使用SQL Database Recovery软件,该软件可以轻松地将整个数据库或选定的数据库组件(如表,视图,SP,函数等)导出到现有数据库。

+0

听起来像无耻的插头 –

相关问题