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

标签 sql-server sql-server-2008

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

我试过下面的代码来完成任务

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

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

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

谢谢。

最佳答案

试试这个 -

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

关于sql-server - 如何为每个表创建默认约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18052574/

相关文章:

asp.net - 数据库字符串字段类型 : should it be nullable?

mysql - 具有可变列数的 SQL 数据库

SQL 多重选择 - 堆叠多个 View 并删除重复项

c# - Database.ExecuteNonQuery 不返回

SQL Server 取消透视多个列

sql-server - 确定是否有任何值为 null,如果为 true,则为 false,否则为 true

sql-server - 如何根据sql中的选定数据集重复行

java - com.microsoft.sqlserver.jdbc.SQLServerException : The "variant" data type is not supported

sql-server - 如何在 IF 条件内创建触发器?

sql-server - 如何在 Dapper 查询中转义 '@'?