【问题标题】:Export SQL Server data from one database to another将 SQL Server 数据从一个数据库导出到另一个
【发布时间】:2017-12-01 10:42:36
【问题描述】:

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

到目前为止,在我的研究中,人们推荐使用 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,然后在我的阅读器对象中更新这个 ID,然后再执行另一个 SqlBulkCopy,这看起来不是理想的方法,是还有其他的吗?

【问题讨论】:

  • 能否指定两个数据库是否在同一个 SQL 实例上?
  • No 不在同一个实例中

标签: sql sql-server c#-4.0


【解决方案1】:

在源 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

然后,最后一步是从客户端应用程序调用此存储过程。

【讨论】:

  • 我的要求是从用户那里获取目标 SQL Server 连接详细信息,数据库名称可以是任何名称,所以我发现我可以使用 sp_addlinkedserver 以编程方式创建链接服务器,所以在您的回答中,我是否可以根据用户输入动态更改 LinkedServer.DestinationDatabase 部分?
  • 您可以像这样/*使用 sp_add*/ 创建一个链接静态,前提是这个存储过程可以由一个使用过的人执行。如果两个用户同时执行此存储过程,则此解决方案不是最佳的。相反,您可以在动态 sql 中使用 OPENDATASOURCE() 函数 (ref)(ODS 函数不接受变量 - 例如,@connection_string - 作为参数)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多