これにより、テーブル内のすべての null 許容列が一覧表示されます。
select tab.name, col.name
from sys.columns col join sys.tables tab on col.object_id = tab.object_id
where tab.type = 'U' and col.is_nullable = 1
カーソルを使用してそれぞれをループし、動的 SQL を実行して列定義を更新する可能性があります。しかし、各列に異なるデータ型がある場合、それは非常に厄介なことになる可能性があります.それらはすべて同じですか?
または、すべての SP クエリを更新して使用することもできます。
ISNULL(fieldname, 0) = 0
その側から NULL 問題を排除する - これは NULL またはゼロに一致します。
編集:
INT、TINYINT、BIGINT、および BIT のすべての列を更新する場合は、このスクリプトで実行できます。ただし、自己責任で使用してください。DB をバックアップし、コピーとして復元し、そこでテストします。次に、WHERE 句のテーブル フィルターのコメントを外して、最初に 1 つのテーブルでテストします。EXEC にはコメントが付けられていますが、テストしてスクリーニングしてからコメントを外してください。
このスクリプトは次のことを行います。
- すべての NULL INT、TINYINT、BIGINT、および BIT をゼロに更新 (false)
- すべての INT、TINYINT、BIGINT、および BIT 列を NOT NULL に変更する
- デフォルトの制約をすべての INT、TINYINT、BIGINT、および BIT 列にゼロ (false) に追加します。
列にデフォルトの制約が既にある場合、3 は失敗することに注意してください。デフォルト値が必要ない場合 (つまり、INSERT ごとに明示的に値を挿入する場合) は削除してください。
DECLARE @table VARCHAR(MAX), @col VARCHAR(MAX), @type VARCHAR(MAX)
DECLARE @q_update VARCHAR(MAX), @q_alter VARCHAR(MAX), @q_default VARCHAR(MAX)
DECLARE c CURSOR FOR
select tab.name, col.name, typ.name
from sys.columns col
join sys.types typ on col.system_type_id = typ.system_type_id
join sys.tables tab on col.object_id = tab.object_id
where tab.type = 'U' and col.is_nullable = 1 and typ.name IN ('int', 'tinyint', 'bigint', 'bit')
--tab.name = 'sometable'
OPEN c
FETCH NEXT FROM c INTO @table, @col, @type
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'UPDATING ' + @table + '.' + @col + ' (' + @type + ')';
SET @q_update = 'UPDATE [' + @table + '] SET [' + @col + '] = 0 WHERE [' + @col + '] IS NULL';
PRINT @q_update;
--EXEC(@q_update);
PRINT '';
SET @q_alter = 'ALTER TABLE [' + @table + '] ALTER COLUMN [' + @col + '] ' + @type + ' NOT NULL';
PRINT @q_alter;
--EXEC(@q_alter);
PRINT '';
SET @q_default = 'ALTER TABLE [' + @table + '] ADD CONSTRAINT ' + @table + '_' + @col + '_DF DEFAULT 0 FOR [' + @col + ']'
PRINT @q_default;
--EXEC(@q_default);
PRINT '----';
FETCH NEXT FROM c INTO @table, @col, @type
END
CLOSE c
DEALLOCATE c
注: わかりやすくするためにカーソルを使用しました。本当に使いたくない場合は、@JamesCurtisリンクを自由に見てください。