C# SQL按照PK FK关系从多个表中递归复制行
我的任务是创建一个存储过程来复制数据库中与给定ID关联的每一条数据。这些数据跨越几十个表。每个表可能有几十个匹配的行 例如: 表帐户C# SQL按照PK FK关系从多个表中递归复制行,c#,sql,database,recursion,C#,Sql,Database,Recursion,我的任务是创建一个存储过程来复制数据库中与给定ID关联的每一条数据。这些数据跨越几十个表。每个表可能有几十个匹配的行 例如: 表帐户 pk=AccountID 表AccountSettings FK=AccountID 表用户 PK=UserID FK=AccountID 表UserContent PK=UserContentID FK=UserID 我想创建一个与AccountID关联的所有内容的副本(它将遍历几乎每个表)。该副本将有一个新的AccountID和UserContentID,但将
pk=AccountID
表AccountSettings
FK=AccountID
表用户
PK=UserID
FK=AccountID
表UserContent
PK=UserContentID
FK=UserID
我想创建一个与AccountID关联的所有内容的副本(它将遍历几乎每个表)。该副本将有一个新的AccountID和UserContentID,但将有相同的UserID。新数据需要在其各自的表中。 :)有趣,对吗 以上只是一个示例,但我将针对50或60个表这样的对象执行此操作。 我已经研究过使用CTE,但对它们还是有点模糊。这可能是最好的方法。我的SQL技能是。。。。。。到目前为止,我已经用它工作了大约40个小时:) 如有任何建议或指示,请向我们咨询。此外,我并不反对通过C#这样做,如果这可能或更好的话
提前感谢您提供的任何信息帮助。解决此问题的最简单方法是蛮力方法:编写一个非常长的过程,分别处理每个表。这很容易出错,并且很难维护。但它的优点是不依赖数据库或数据库元数据处于任何特别一致的状态 如果您想要基于元数据工作的东西,事情会更有趣。您面临三个挑战:
缺点:如果您有这样的现象,例如字段“实际上”是相同的,但类型不同,或者复杂的三方关系没有正确建模,或者嵌入了需要解析的CSV列表,那么这将不起作用。只有当数据库状态良好且建模良好时,它才能工作。否则你需要诉诸暴力 在您的示例中,1个帐户可以有0-n个用户,但1个用户只能有0-1个帐户=>第二个帐户不可能有相同的用户ID(当然,如果您不想删除用户与第一个帐户的连接),哇。我不会这样做的。CTE只会递归100次,因此您可能会超过此值。为什么不根据临时表中表的外键继续添加到临时表中,直到没有添加新行为止?@saarp:为什么CTE只会递归100次?这是一个荒谬的假设。您使用的是哪种数据库管理系统?PostgreSQL?神谕DB2?@一匹没有名字的马:不是假设,而是事实。请参阅上面的MAXRECURSION参数示例(默认值为100,介于0和32767之间)。谢谢。最后我把所有的事情都写了出来。它相当大,大约有1800行,但它工作得非常好。让它保持最新是一件痛苦的事。谢谢你对这件事的想法。我最终在我的解决方案中使用了EF,这比我最初预期的要容易得多,所以我肯定会推荐使用它。最重要的是,它更易于维护,甚至更易于扩展。@Tfrascaoli感谢您的赞誉!我很高兴我的建议很有帮助!