SQL Server - 为所有表添加默认约束

4
有没有一种方法可以编写一个脚本,检查数据库中的每个表,查找名为IDuniqueidentifier列,并在该列上添加DEFAULT约束为NEWID(),如果不存在DEFAULT约束的话?

2
有没有更具体的要求?是的。 - Mitch Wheat
使用 T-SQL 还是 SMO/DMO?是为了查找特定值还是仅仅查找列类型为唯一标识符类型? - RobS
1个回答

3
这段脚本在任何名为“ID”的uniqueidentifier列上创建一个DEFAULT约束,其值为NEWID(),前提是该列尚未有DEFAULT约束。
SET NOCOUNT ON

DECLARE @tableVarId int
DECLARE @alterSql   nvarchar(MAX)

DECLARE @columnsNeedingDefault TABLE
(
  TableVarId    int IDENTITY (1,1) PRIMARY KEY,
  AlterSql      nvarchar(MAX)
)

INSERT INTO @columnsNeedingDefault (AlterSql)
SELECT
  'ALTER TABLE ' + QUOTENAME(a_Table.[name]) +
  ' ADD CONSTRAINT [DF_' + a_Table.[name] + '_' + a_Column.name +
  '] DEFAULT NEWID() FOR ' + QUOTENAME(a_Column.name)
FROM
  sys.columns AS a_Column
INNER JOIN
  sys.tables AS a_Table ON a_Column.[object_id] = a_Table.[object_id]
WHERE
  a_Column.[name] = 'ID'
  AND
  a_Column.user_type_id = 36 -- uniqueidentifier
  AND
  NOT EXISTS
  (
    SELECT
      *
    FROM
      sys.default_constraints AS a_DefaultConstraint
    WHERE   a_DefaultConstraint.parent_object_id = a_Table.[object_id]
      AND   a_DefaultConstraint.parent_column_id = a_Column.column_id
      AND   a_DefaultConstraint.type_desc = 'DEFAULT_CONSTRAINT'
  )

SET @tableVarId = (SELECT MIN(TableVarId) FROM @columnsNeedingDefault)
WHILE @tableVarId IS NOT NULL
  BEGIN
    SELECT @alterSql = AlterSql FROM @columnsNeedingDefault

    PRINT @alterSql
    EXEC sp_executesql @alterSql

    SET @tableVarId = (SELECT MIN(TableVarId) FROM @columnsNeedingDefault
                       WHERE TableVarId > @tableVarId)
  END

好的,那很棒,但我实际上正在寻找一种检测数据库中每个表是否都有一个“ID”字段的方法,如果有,则修改它并添加约束...就像下面这样... [ADD CONSTRAINT DF_DonorStatus DEFAULT newid() FOR ID] 抱歉,我记不得“代码”括号设置了。 - bstorrie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接