2012-09-06 23 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在那里,因为有些可能会失败。您可能需要为每个数据库/表/列组合添加打印输出,以便您可以打印状态消息,以更轻松地将任何潜在错误与实际数据库/表/列相关联。

相关问题