SQL以PK FK关系递归地复制来自多个表的行

时间:2012-03-09 21:59:50

标签: c# sql database recursion

我的任务是创建一个存储过程来复制与数据库中给定ID相关的每一段数据。这些数据涵盖了数十个表格。每个表可能有几十个匹配的行。

示例:

表帐户
   pk = AccountID

表帐户设置
   FK = AccountID

表用户
   PK =用户ID
   FK = AccountID

表UserContent
   PK = UserContentID
   FK =用户ID

我想创建一个与AccountID相关联的所有内容的副本(几乎遍历每个表)该副本将具有新的AccountID和UserContentID,但具有相同的UserID。新数据需要在各自的表中。 :)好玩吧?

以上只是一个示例,但我会为50或60个表格做这个。 我已经研究过使用CTE,但我们仍然有点模糊。这可能是最好的方法。我的SQL技能......到目前为止我已经使用了大约40个小时的记录:)

任何关于在哪里寻找的建议或指示都将不胜感激。另外,我不反对通过C#这样做,如果可能或更好。

提前感谢您提供任何信息帮助。

1 个答案:

答案 0 :(得分:3)

解决这个问题的最简单方法是强力方式:编写一个非常长的proc,分别处理每个表。这将容易出错并且很难维护。但它的优点是不依赖于数据库或数据库元数据处于任何特别一致的状态。

如果你想要一些基于元数据的东西,事情会更有趣。那里有三个挑战:

  1. 您需要以编程方式识别所有相关表。
  2. 您需要为所有50或60个生成插入语句。
  3. 您需要为距离Account表超过一两步的表捕获生成的ID,以便它们可以在更多复制的记录中用作外键。
  4. 我过去曾看过这个问题,虽然我不能为你提供防水算法,但我可以给你一个通用的启发式方法。换句话说:这就是我接近它的方式。

    1. 使用更高版本的MS Entity Framework(您说您可以使用C#),构建Account表的模型和所有相关表。
    2. 回顾一下它。如果您的数据库很多,那么您的应用程序所假设的某些关系,无论出于何种原因,都不会在数据库中设置实际的外键关系。无论如何,在模型中创建它们。
    3. 在C#中编写一个小的递归例程,它可以获取Account对象并遍历所有相关的表。选择几个Account实例并将其转储表文件和密钥信息到文件中。检查完整性和合理性。
    4. 一旦你满意,你就拥有了一个好的模型和一个很好的算法来获取所有东西,是时候破解代码了。您需要编写一个更复杂的算法,该算法可以读取帐户并递归克隆引用它的所有记录。你可能需要反思才能做到这一点,但并不难:你需要的所有元数据都会在那里,某处。
    5. 测试您的代码。留出足够的时间进行调试。
    6. 在步骤3中使用您的第一个算法来比较结果的完整性和准确性。
    7. EF方法的优势:随着数据库的变化,您的模型也会发生变化,如果您的代码是基于元数据的,那么它应该能够适应。

      缺点:如果您有“真正”相同但不同类型的字段,或者未正确建模的复杂三向关系,或者您需要解析的嵌入式CSV列表等现象,这不行。它只适用于您的数据库状态良好且模型良好的情况。否则你需要诉诸蛮力。