1

如何使 SQL Server 以块的形式提交插入?我需要将大量行从旧数据库复制到新表中,它有几个问题:

  1. 它需要很长时间才能完成,并且在整个事务完成之前我看不到表中的任何行。

  2. 我的日志文件正在疯狂增长,它可能会用完空间。

  3. 如果中间出现问题,我必须重复所有内容。

如果我添加SET ROWCOUNT 500,我可以限制行数,但我不知道如何继续使用最后插入的 ID。我可能会查询新表以查看最后插入的内容,但我不确定这是否正确。这有点困难,因为我的where子句不使用ID列,所以我不确定如何确切地知道从哪里继续。

最好的方法是什么?是否有“for循环”或允许我每隔一段时间提交一次的东西?

我正在为 SQL Server 2008 R2 使用 SSMS。

4

2 回答 2

2

即使 TomTom 的回答带有讽刺意味,它也包含两个基本选项,可能会对您有所帮助:

  1. 您可以在 T-SQL 中编写一个循环(例如参见while)并使用 TOP 和 OFFSET 来选择块(您需要一个 order by)。您可以根据Microsoft最小化 looging 。如果您只是担心重新启动而不重做所有事情,这应该没问题,尽管我不希望它很快。

  2. 您可以将您的选择导出到文件并使用批量插入来加载它。

您可以在此处(关于批量导入和批量导出操作)此处(插入部分最佳实践)找到更多选项。

于 2012-07-02T10:01:32.413 回答
-4

如何使 SQL Server 以块的形式提交插入?

您编写将其插入块中的代码,非常容易。

1:是的,这就是交易的运作方式,你知道的。

2:是的,这就是交易的运作方式,你知道的。

3:是的,你猜怎么着——这就是交易的运作方式,你知道的;)

但我不知道如何继续使用最后插入的 ID

叫做编程。在客户端生成 ID。记住你生成的最后一个。

一般来说,我建议不要在代码中插入 - 根据您的代码的工作方式,这听起来像是数据复制操作,并且还有其他机制(批量复制接口)。

我正在为 SQL Server 2008 R2 使用 SSMS

基本上它的行为与您对其进行编程一样。您可以轻松地在 SSMS 端放入一些循环,或导出到文件,然后批量插入文件。虽然不会帮助您解决第 2 项...除非您使用简单的备份模型并且不关心恢复。

那么3也很复杂 - 你如何正确重启?很多额外的代码。

最好的方法取决于具体情况,遗憾的是你太模糊了,不能盲目猜测。

于 2012-07-02T08:47:28.907 回答