生成带有外键约束的插入语句
Generate insert statements with foreign key constraints
我遇到了一个问题,整个 table 的数据被删除了。它是一个子节点 table,包含自己的主键、指向其父节点的外键和一些其他数据。
我尝试使用 Merge,它是从我在此处找到的存储过程生成的:
https://github.com/readyroll/generate-sql-merge
这会为您的整个 table 生成一个巨大的合并语句。这工作了一段时间,但后来我发现来自父 table 的记录已被删除,而 Merge 处理得不太好。
我试过重写它,但我陷入其中,感觉就像其他人以前做过的事情。
我真正想要的是一种生成 1000 条插入语句的方法,每个语句上面都有一个 If Exists
IF NOT EXISTS (select PK from ChildTable where ID = <about to be inserted>) AND EXISTS (select FK from ParentTable where ID = <about to be inserted>)
INSERT RECORD
OUTPUT PK TO LOG TABLE
大约有 20,000 条记录,所以我真的不想手动执行这些操作,而且由于删除事件在几个月内发生了几次,我需要从几个不同的数据库生成数据以重新创建整个画面。
我想将插入的 ID 保存在日志中 table,这样我就可以知道插入了什么,这样数据就可以出于任何原因恢复到规定状态。
也欢迎对我的方法提出任何建议。
谢谢:)
长话短说,我尝试了几种方法来解决这个问题,最好的方法是使用 SQL 生成脚本为 table 生成插入语句,并将它们放入临时 table.
因为我只想导入90%的数据,并根据一些条件排除特定的记录,我本来想我应该用一个IF包装每个Insert,但是在尝试创建查询时20,000个IF崩溃了计划。
相反,我将所有没有过滤器的记录插入到临时 table。然后我用几个 Delete 语句从这个 table 中删除了所有我不想要的记录。
最后我说对于临时 table 中的所有剩余数据,将其插入到实际的 table 中,数据最初是从那里丢失的。
这非常有效,SQL 管理器能够 运行 而不会崩溃。我在做什么也更清楚了,而且我不必在字符串生成器中添加很多复杂的 IF。
我还在插入时使用了 OUTPUT 来记录我插入的所有记录 ID,以提供我需要的审计线索。
至于字符串生成器,查询又长又复杂,Excel 抱怨 256 个字符的限制,在连接 26 后我最终使用 20 多列来构建我的查询数据列。当我在 Excel 中使用自动公式拖动功能时,它会使我的机器在处理如此多的记录时崩溃,而我有一台漂亮的 g运行ty 机器!
使用脚本生成器而不是字符串生成器还有一个好处,即无论如何都不会更改数据。它是一模一样的,所以奇怪的字符和换行等都不是问题。
我遇到了一个问题,整个 table 的数据被删除了。它是一个子节点 table,包含自己的主键、指向其父节点的外键和一些其他数据。
我尝试使用 Merge,它是从我在此处找到的存储过程生成的: https://github.com/readyroll/generate-sql-merge
这会为您的整个 table 生成一个巨大的合并语句。这工作了一段时间,但后来我发现来自父 table 的记录已被删除,而 Merge 处理得不太好。
我试过重写它,但我陷入其中,感觉就像其他人以前做过的事情。
我真正想要的是一种生成 1000 条插入语句的方法,每个语句上面都有一个 If Exists
IF NOT EXISTS (select PK from ChildTable where ID = <about to be inserted>) AND EXISTS (select FK from ParentTable where ID = <about to be inserted>)
INSERT RECORD
OUTPUT PK TO LOG TABLE
大约有 20,000 条记录,所以我真的不想手动执行这些操作,而且由于删除事件在几个月内发生了几次,我需要从几个不同的数据库生成数据以重新创建整个画面。
我想将插入的 ID 保存在日志中 table,这样我就可以知道插入了什么,这样数据就可以出于任何原因恢复到规定状态。
也欢迎对我的方法提出任何建议。
谢谢:)
长话短说,我尝试了几种方法来解决这个问题,最好的方法是使用 SQL 生成脚本为 table 生成插入语句,并将它们放入临时 table.
因为我只想导入90%的数据,并根据一些条件排除特定的记录,我本来想我应该用一个IF包装每个Insert,但是在尝试创建查询时20,000个IF崩溃了计划。
相反,我将所有没有过滤器的记录插入到临时 table。然后我用几个 Delete 语句从这个 table 中删除了所有我不想要的记录。
最后我说对于临时 table 中的所有剩余数据,将其插入到实际的 table 中,数据最初是从那里丢失的。
这非常有效,SQL 管理器能够 运行 而不会崩溃。我在做什么也更清楚了,而且我不必在字符串生成器中添加很多复杂的 IF。
我还在插入时使用了 OUTPUT 来记录我插入的所有记录 ID,以提供我需要的审计线索。
至于字符串生成器,查询又长又复杂,Excel 抱怨 256 个字符的限制,在连接 26 后我最终使用 20 多列来构建我的查询数据列。当我在 Excel 中使用自动公式拖动功能时,它会使我的机器在处理如此多的记录时崩溃,而我有一台漂亮的 g运行ty 机器!
使用脚本生成器而不是字符串生成器还有一个好处,即无论如何都不会更改数据。它是一模一样的,所以奇怪的字符和换行等都不是问题。