我需要创建一个复制邻接模型中的节点的 sql 存储过程(Sql Server 2008 - T-SQL)。
可以将表视为具有两列,Id 和 ParentId(FK 到 Id)。复制意味着所有的下属也需要被复制。
我认为使用 WITH 是一个好的开始,但我很好奇是否可以在不使用光标的情况下完成此副本。
我需要创建一个复制邻接模型中的节点的 sql 存储过程(Sql Server 2008 - T-SQL)。
可以将表视为具有两列,Id 和 ParentId(FK 到 Id)。复制意味着所有的下属也需要被复制。
我认为使用 WITH 是一个好的开始,但我很好奇是否可以在不使用光标的情况下完成此副本。
邻接表的基本问题是在 SQL 中没有通用的方法来提取整个子树,因此您已经遇到了一个问题,即在不使用游标的情况下识别需要复制的所有行。
如果可能,将您的邻接列表迁移到嵌套集模型,这样您就可以轻松识别子树的所有节点。但是,对于一般的插入和删除,嵌套集模型的维护更为复杂。
编辑:正如 'a_horse_with_no_name' 所指出的,一般 SQL 有一种方法来处理邻接列表、递归公用表表达式。
复制整个子树有点问题,因为当您复制子树时,您要么
在任何一种情况下,您都会在某些时候通过不一致的状态拖动数据 - 这表明您的设计存在一些问题(例如,您的记录是否需要有多个父项?如果是,那么您应该考虑重新设计)。
因此,您应该使用更完整的示例来更新答案,以说明您正在尝试做什么。
一种解决方案是有一个临时表,选择插入应该不是问题,它只是更新引用的 ID,这将是一个问题。
所以
该过程需要像这样进行,因为在初始 WITH INSERT 中很难更改 ID(记录 ID 和引用父级的 ID)。但是,如果有一个仅依赖于 max_id 或仅依赖于旧 ID 的好函数,则它是可能的。