为sql-2012 express中的所有列、表和数据库提供默认值

为sql-2012 express中的所有列、表和数据库提供默认值,sql,sql-server,database,stored-procedures,default-value,Sql,Sql Server,Database,Stored Procedures,Default Value,我正在开发sql 2012 server express edition 我想将默认值分配给所有用户数据库中所有表的所有列 所有数字、整数、smallint、tinyint等0默认值 所有日期相关字段“01-jan-1900”默认值 所有字符字段Varchar etc默认值 所有逻辑字段0默认值 我不想用table designer做这件事。如何使用命令或存储过程执行此操作 不为主键字段和自动递增字段标识列设置此默认值 我是SQL编程新手,每次我都必须注意空值,对于我的工作来说,空值除了它们的默

我正在开发sql 2012 server express edition

我想将默认值分配给所有用户数据库中所有表的所有列

所有数字、整数、smallint、tinyint等0默认值 所有日期相关字段“01-jan-1900”默认值 所有字符字段Varchar etc默认值 所有逻辑字段0默认值 我不想用table designer做这件事。如何使用命令或存储过程执行此操作

不为主键字段和自动递增字段标识列设置此默认值


我是SQL编程新手,每次我都必须注意空值,对于我的工作来说,空值除了它们的默认值之外没有任何意义。这将对所有现有表执行。

您可以对每个数据库尝试类似的解决方案:

DECLARE @SQL nvarchar(max) = ''

SELECT
    @SQL = @SQL +
    'UPDATE [' + s.name + '].[' + o.name + '] SET [' + c.name + '] = ' +
    CASE
        WHEN t.name IN ('int', 'bigint', 'bit', 'decimal', 'money', 'numeric', 'smallint', 'smallmoney', 'tinyint', 'float', 'real') THEN '0'
        WHEN t.name IN ('char', 'varchar', 'text') THEN ''''''
        WHEN t.name IN ('nchar', 'nvarchar', 'ntext') THEN 'N'''''
        WHEN t.name IN ('date', 'datetime', 'datetime2', 'datetimeoffset', 'smalldatetime', 'time') THEN 'CAST(''1900-01-01'' AS ' + t.name + ')'
        ELSE '0'
    END +
    ' WHERE [' + c.name + '] IS NULL; '
FROM
    sys.schemas s 
    INNER JOIN
    sys.objects o ON s.[schema_id] = o.[schema_id]
    INNER JOIN
    sys.columns c ON o.[object_id] = c.[object_id]
    INNER JOIN
    sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
WHERE
    o.[type] = 'U'
    AND
    c.is_identity <> 1
    -- If you want to apply it to only one table use this:
    AND
    o.name = 'yourTable'

EXEC(@SQL)

获取所有用户定义的表,获取它们的列,检查默认值是否已经存在,生成动态sql以更新默认值,使用sp_exec执行它?这是一个不寻常的要求。我们可以知道你为什么要这样做吗?除非您的表都有主键或唯一键,否则仅插入两行具有所有默认值的行将生成一个具有重复项的无效表。@John Saunders主键字段和自动递增字段标识列不设置此默认值。我是SQL编程新手,每次我都必须注意空值,对于我的工作来说,空值除了它们的默认值之外没有任何意义。对所有现有的表都要这样做。对我来说,这似乎是一个X-Y问题。为什么你觉得你需要这样做?空值真的很有用。每个日期列都需要相同的默认值,这很不寻常,因为只有一个示例。设想一个名为contract\u start\u date的列。如果您的公司成立于1985年,那么您提出的默认值构成虚假事实。不要储存虚假的事实;存储真实的事实。一个考虑不周的默认值可以打破许多合理的约束。我同意@TonyHopkinson的观点,这看起来像是一个X-Y问题。感谢@shA.t发布了这个漂亮的代码。它有助于将现有的空值设置为默认值。我试图为以后添加的行设置默认值。如果很难一次性设置数据库表的所有默认值,那么我们将一步一步地进行。首先,请帮助我将默认值设置为一个表的列。我不知道这种类型的编码,比如sys.schemas、c.system\u type\u id等等,所以我请求帮助。希望您能回复。@user3328343这是动态SQL,您可以根据自己的目的筛选查询;。