私は自分の仕事でもこの問題に遭遇しました。そして私の解決策は#2に沿っています。
手順は次のとおりです(SQL Server 2005を使用しています):
1)デフォルト値で列をテーブルに追加します:
ALTER TABLE MyTable ADD MyColumn varchar(40) DEFAULT('')
2)NOT NULL
を追加します NOCHECK
による制約 オプション。 NOCHECK
既存の値を強制しません:
ALTER TABLE MyTable WITH NOCHECK
ADD CONSTRAINT MyColumn_NOTNULL CHECK (MyColumn IS NOT NULL)
3)テーブルの値を段階的に更新します:
GO
UPDATE TOP(3000) MyTable SET MyColumn = '' WHERE MyColumn IS NULL
GO 1000
-
updateステートメントは、最大3000レコードのみを更新します。これにより、その時点でデータのチャンクを保存できます。テーブルにシーケンス主キーがないため、「MyColumnISNULL」を使用する必要があります。
-
GO 1000
前のステートメントを1000回実行します。これにより、300万レコードが更新されます。さらに必要な場合は、この数を増やすだけです。 SQLServerがUPDATEステートメントに対して0レコードを返すまで実行を継続します。