如何为每个表创建默认约束

时间:2013-08-05 07:20:13

标签: sql-server sql-server-2008

我的数据库中有大约150个表,现在我需要在每个表上添加一个列约束(InsertedOn),默认值为GetDate()

我尝试过以下代码来完成任务

exec sp_msforeachtable 'ALTER TABLE ? ADD CONSTRAINT DF_InsertedOn DEFAULT GetDate() FOR [InsertedOn]';

但我的问题是约束名称,上面的代码在尝试为第二个表创建约束时失败,因为使用的约束名称

有没有办法使用相同的 sp_msforeachtable 来完成任务?

谢谢。

2 个答案:

答案 0 :(得分:3)

试试这个 -

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = STUFF((
    SELECT CHAR(13) + 'ALTER TABLE [' + s.name + '].[' + o.name  + '] 
        ADD [InsertedOn] DATETIME NOT NULL CONSTRAINT [DF_' + o.name + '_InsertedOn] DEFAULT GETDATE()'
    FROM sys.objects o WITH (NOWAIT)
    JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id]
    WHERE NOT EXISTS(
            SELECT 1
            FROM sys.columns c WITH (NOWAIT)
            WHERE c.[object_id] = o.[object_id]
                AND c.name = 'InsertedOn'
        )
        AND o.[type] = 'U'
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

PRINT @SQL
EXEC sys.sp_executesql @SQL

输出 -

ALTER TABLE [tt].[t1] 
ADD [InsertedOn] DATETIME NOT NULL CONSTRAINT [DF_t1_InsertedOn] DEFAULT GETDATE()
ALTER TABLE [tt].[t2] 
ADD [InsertedOn] DATETIME NOT NULL CONSTRAINT [DF_t2_InsertedOn] DEFAULT GETDATE()

答案 1 :(得分:3)

要生成scrips,您可以使用此代码。它使用系统视图sys.tablessys.schemassys.columns

DECLARE @ColumnName VARCHAR(100) = 'InsertedOn'

SELECT
    'ALTER TABLE ' + s.name + '.' + t.name + 
    ' ADD CONSTRAINT DF_' + t.name + '_' + @ColumnName + 
    ' DEFAULT GetDate() FOR ' + @ColumnName
FROM sys.tables t
JOIN sys.schemas s ON s.schema_id = t.schema_id
WHERE EXISTS (
        SELECT *
        FROM sys.columns c
        WHERE c.object_id = t.object_id
            AND name = @ColumnName
    )