MS SQL Server,多次插入

jon*_*ers 3 sql t-sql sql-server sql-server-2005

假设我写了查询:

INSERT INTO DestinationTable
(ColumnA, ColumnB, ColumnC, etc.)
SELECT FROM SourceTable
(ColumnA, ColumnB, ColumnC, etc.)
Run Code Online (Sandbox Code Playgroud)

我的源表有2200万行.

SQL服务器填满我的硬盘驱动器,并出错.

为什么SQL服务器无法处理我的查询?

我应该使用游标并一次插入一行吗?

PS - 它是SQL Express 2005,但我可以尝试完整版.

更新:我还想提一下,当我在管理工作室查看时,我的源表只占用大约1GB的存储空间.然而,我的25GB可用磁盘空间不知何故被填满了吗?我也在使用2个不同的数据库Source.mdf - > Destination.mdf,我不知道这是否有任何区别.

gbn*_*gbn 8

批量更新......

INSERT INTO DestinationTable
    (ColumnA, ColumnB, ColumnC, etc.)
SELECT TOP 100000 ColumnA, ColumnB, ColumnC, etc.
FROM SourceTable
WHERE NOT EXISTS (SELECT *
    FROM DestinationTable
    WHERE DestinationTable.KeyCols = SourceTable.KeyCols)

WHILE @@ROWCOUNT <> 0
    INSERT INTO DestinationTable
        (ColumnA, ColumnB, ColumnC, etc.)
    SELECT TOP 100000 ColumnA, ColumnB, ColumnC, etc.
    FROM SourceTable
    WHERE NOT EXISTS (SELECT *
        FROM DestinationTable
        WHERE DestinationTable.KeyCols = SourceTable.KeyCols)
Run Code Online (Sandbox Code Playgroud)

如果您需要在一个txn等中处理检查点,日志文件管理,则有各种变体

  • 我认为光标需要一年半的时间才能插入所有数据;) (6认同)
  • @ Jonathan.Peppers:一个CURSOR仍然需要资源,锁,也许tempdb中的22m行取决于你如何声明它 (2认同)