SQL插入 - for循环

时间:2012-07-02 08:36:24

标签: sql sql-server insert-into logfile

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

  1. 完成需要很长时间,在整个交易完成之前,我在表格中看不到任何行。

  2. 我的日志文件越来越疯狂,可能会用完空间。

  3. 如果中间出现问题,我必须重复一切。

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

    最好的方法是什么?是否存在“for循环”或允许我偶尔提交一次的东西?

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

2 个答案:

答案 0 :(得分:2)

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

  1. 您可以在T-SQL中编写一个循环(参见例如while)并使用TOP和OFFSET来选择块(您需要一个订单)。根据{{​​3}},您可以最大限度地减少欺骗行为。如果你只是担心重新启动而不重做一切,这应该没问题,但我不认为它会很快。

  2. 您可以将选择内容导出到文件,然后使用批量插入来加载它。

  3. 您可以找到更多选项Microsofthere (About Bulk Import and Bulk Export Operations)

答案 1 :(得分:-4)

  

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

您可以编写将代码插入块中的代码,非常简单。

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

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

3:是的,猜猜是什么 - 交易如何运作,你知道;)

  

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

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

一般情况下,我建议不要在代码中插入INSERT - 这取决于你的代码是如何工作的,这听起来像数据复制操作,还有其他机制(批量复制接口)。

  

我正在使用SSMS for SQL Server 2008 R2

基本上它就像你编程一样。您可以轻松地在SSMS端放入一些循环,或导出到文件,然后批量插入文件。虽然不会帮助你完成第2项......除非你选择简单的备份模型而不关心恢复。

此外3还很复杂 - 你如何正确重启?许多额外的代码。

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