【问题标题】:Programmatically copying data across tables in different sql server databases having different schemas以编程方式在具有不同架构的不同 sql server 数据库中的表之间复制数据
【发布时间】:2012-06-22 12:29:40
【问题描述】:

我正在尝试构建一个系统,它获取 SQL Server 数据库中一些相关表的快照,将日期时间元素附加到它并存储在不同的数据库中。因此,新数据库包含不同日期时间的数据快照(导致不同的模式)。

我已经在 Sql Server Management Studio 上使用 t-sql 让它工作了。我可以用 C# 编写查询并在两个数据库之间执行吗?我阅读了有关 ADO.NET 的信息,但找不到建立两个 SQL 连接然后执行传输查询的方法。

有没有更有效的方法来做到这一点?我正在使用 Microsoft SQL Server 2012。

【问题讨论】:

    标签: c# database ado.net sql-server-2012


    【解决方案1】:

    您可能应该开始阅读the Wikipedia page about ETL

    另外,如果你想perform ETL in pure C#,你可以看看Rhino ETL之类的东西。

    【讨论】:

    • Thanx Aledeniz,这正是我想要的。
    【解决方案2】:

    您应该将查询放在存储过程中。然后从 Management Studio、C# 或任何其他程序/接口调用是微不足道的。一个简单的例子:

    CREATE PROCEDURE dbo.foo
    AS
    BEGIN
      SET NOCOUNT ON;
    
      -- your query
    END
    GO
    

    然后从C#(假设存储过程不返回任何结果):

    SqlConnection conn = new SqlConnection("Your Connection String");
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "dbo.foo";
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Connection = conn;
    conn.Open();
    cmd.ExecuteNonQuery();
    conn.Close();
    

    这不是一个详尽的代码示例(没有错误处理、处置等),只是提供一个想法。

    编辑

    您应该在两个 SQL Server 实例之间创建一个linked server。然后您的查询可以说如下:

    SELECT * INTO [linkedserver].database.dbo.tablename
      FROM dbo.whatever
      -- WHERE ... ;
    

    这将比将数据拉入 C# 更有效。

    【讨论】:

    • 谢谢 Aaron,但有更有效的技术吗?我正在处理大约有一百万个条目的表。我阅读了有关 sqlbulkcopy 的信息,但不知道如何将它与具有不同架构的表一起使用。
    • SqlBulkCopy 用于将大块数据复制到您的程序中,然后复制到其他地方。为什么你认为这比让 SQL Server 在内部做更有效?您可以显示您正在使用的查询作为问题的一部分吗?你确实说过你已经让它工作了,所以如果你只是想从 C# 调用这个查询,我建议最有效的方法是将查询放在存储过程中,然后从 C# 调用它方式。将数据拉入 C# 是一种浪费,而且效率永远不会更高。
    • 再次感谢 Aaron,现在我对问题的解决方案有了更好的了解。您的解决方案效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多