9

我有一个数据库,里面有很多位类型的列。添加其他列后,我需要所有旧列都具有默认的“false”值。

4

2 回答 2

22

要将每个旧列更新为 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

现在,您必须对每个旧列运行此操作,所以希望您没有太多。

于 2012-09-06T13:46:03.377 回答
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 存在是因为有些可能会失败。您可能希望为每个 db/table/column 组合添加打印输出,以便您可以打印状态消息,以便更轻松地将任何潜在错误与实际的 db/table/column 关联起来。

于 2012-09-06T14:26:06.223 回答