2012-09-06 3 views

答えて

18

、あなたは(列ごとに)このクエリを使用することができます。

その後
UPDATE MyTable 
SET OldCol1 = 0 
WHERE OldCol1 IS NULL 

、あなたが任意の将来の値として0のデフォルト値を持つようにしたい場合はこれを使用してください:

ALTER TABLE MyTable 
ALTER COLUMN OldCol1 bit NOT NULL 

ALTER TABLE MyTable 
ADD CONSTRAINT OldCol1ShouldBeFalse DEFAULT 0 FOR OldCol1 

これを各古い列に対して実行する必要がありますので、多すぎることはありません。

3

このネストされた動的SQLは、これを1つずつ実行したくない場合にジョブを実行します。列にはまだデフォルト制約(列がNULL可能であっても可能です)がないことを検証するために最初にチェックは行われませんが、スクリプトはそのように拡張される可能性がありますそれがデフォルトの場合のそのような制約1)。

DECLARE @sql NVARCHAR(MAX); 
SET @sql = N'DECLARE @sql NVARCHAR(MAX); SET @sql = N'''';'; 

SELECT @sql = @sql + N' 
    SELECT @sql = @sql + N''UPDATE ' + QUOTENAME(name) 
    + '.'' + QUOTENAME(s.name) + ''.'' + QUOTENAME(t.name) + '' 
    SET '' + QUOTENAME(c.name) + '' = 0 
    WHERE '' + QUOTENAME(c.name) + '' IS NULL; 

    ALTER TABLE ' + QUOTENAME(name) + '.'' + QUOTENAME(s.name) 
    + ''.'' + QUOTENAME(t.name) 
    + '' ADD CONSTRAINT '' + c.name + ''_FalseByDefault 
    DEFAULT (0) FOR '' + QUOTENAME(c.name) + ''; 

    ALTER TABLE ' + QUOTENAME(name) + '.'' + QUOTENAME(s.name) 
    + ''.'' + QUOTENAME(t.name) 
    + '' ALTER COLUMN '' + QUOTENAME(c.name) + '' BIT NOT NULL; 
    '' 

FROM ' + QUOTENAME(name) + '.sys.columns AS c 
INNER JOIN ' + QUOTENAME(name) + '.sys.tables AS t 
ON c.[object_id] = t.[object_id] 
INNER JOIN ' + QUOTENAME(name) + '.sys.schemas AS s 
ON t.[schema_id] = s.[schema_id] 
WHERE c.system_type_id = 104 AND c.is_nullable = 1 
AND t.is_ms_shipped = 0;' 
FROM sys.databases WHERE database_id > 4; 

SET @sql = @sql + 'PRINT @sql; 
    --EXEC sp_executesql @sql;'; 

EXEC sp_executesql @sql; 

それはを見て、本当に醜いだ、とPRINTコマンドが必ずしも原因Management Studioの出力制限のために完全ではないだろう。しかし、最初のいくつかのコマンドが正しいと確信したら、2番目の最後の行をコメントアウトしてコメントを外し、スクリプトを再度実行して変更を加えることができます。いくつかは失敗するかもしれないので、GOはそこにあります。潜在的なエラーと実際のdb/table/columnをより簡単に関連付けるためにステータスメッセージを出力できるように、db/table/columnの組み合わせごとに印刷出力を追加することができます。

関連する問題