事务日志在大表中完全更改列类型

Mar*_*aff 6 sql-server ddl transaction-log

我有一个超过 4 亿行的表,想将其中一列的数据类型转换datetimedatetime2(2).

如果我执行我的语句,我会收到以下错误:

由于“ACTIVE_TRANSACTION”,数据库“xxxx”的事务日志已满

那么这里有没有可能更新这个表?

(我的日志文件的最大大小为 150GB,我没有更多可用空间。)

小智 5

斯科特的回答让我意识到你可能有足够的空间
来做这个:创建一个带有临时名称的 datetime2 列,并将原始列内容分批传输到它(以防止你的日志空间不足——我假设你的数据库处于简单恢复模式)。
然后删除原始列,并将新列重命名为旧列名。


Sco*_*red 0

一种选择“可能”是将BCP导出当前数据(同时将相关列转换为其新数据类型)到平面文件,删除并使用新数据类型重新创建表,然后使用 -b 参数BCP导入数据限制每个批次中记录的行数,从而防止事务日志空间不足。