如何在块中进行SQL Server提交插入?我需要将旧数据库中的大量行复制到新表中,它有几个问题:
完成需要很长时间,在整个交易完成之前,我在表格中看不到任何行。
我的日志文件越来越疯狂,可能会用完空间。
如果中间出现问题,我必须重复一切。
如果我添加SET ROWCOUNT 500
,我可以限制行数,但我不知道如何继续使用最后插入的ID。我可能会查询新表以查看最后插入的内容,但我不确定这是否正确。这有点困难,因为我的where
子句不使用ID
列,所以我不知道如何知道确切的继续位置。
最好的方法是什么?是否存在“for循环”或允许我偶尔提交一次的东西?
我正在使用SSMS for SQL Server 2008 R2。
答案 0 :(得分:2)
即使TomTom的回答是讽刺性的,它也包含两个基本选项,可能会对您有所帮助:
您可以在T-SQL中编写一个循环(参见例如while)并使用TOP和OFFSET来选择块(您需要一个订单)。根据{{3}},您可以最大限度地减少欺骗行为。如果你只是担心重新启动而不重做一切,这应该没问题,但我不认为它会很快。
您可以将选择内容导出到文件,然后使用批量插入来加载它。
您可以找到更多选项Microsoft和here (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还很复杂 - 你如何正确重启?许多额外的代码。
最好的方法取决于具体情况,遗憾的是你太模糊了,不能盲目猜测。