2012-09-06 52 views

回答

18

更新每個老欄爲0,您可以使用此查詢(上一列逐列的基礎上):

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)。

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中的輸出限制。但是,一旦您確信前幾個命令看起來正確,您可以對此發表評論並取消註釋,並再次運行腳本以進行更改。 GO在那裏,因爲有些可能會失敗。您可能需要爲每個數據庫/表/列組合添加打印輸出,以便您可以打印狀態消息,以更輕鬆地將任何潛在錯誤與實際數據庫/表/列相關聯。

相關問題