码迷,mamicode.com
首页 > 其他好文 > 详细

修正或添加字段默认值约束的名称

时间:2017-09-18 19:41:20      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:object   identity   objects   tab   big   arch   没有   traints   表名   

旧项目中的数据库约束名称不规范,写了个脚本重新修改。

1. 名称重新修改为已有的默认值约束的名称为‘DF_‘ + 表名 + 字段名;

2. 没有设置默认值约束的列设置默认值,字符串为空,数值为0;

3. 时间字段除了addtime不加默认值;

 

--修正或添加字段默认值约束的名称为DF_表名_字段

/*
    SELECT 
    tabName= LOWER(O.name), --表名
    colName=LOWER(C.name), --字段名
    coltype= LOWER(T.name), --类型
    dfVal=ISNULL(D.definition,N‘‘),  --默认值
    dfName=ISNULL(D.name,N‘‘)    --默认值约束名称
     ,dfSName = (‘DF_‘ + O.name + ‘_‘ + C.name)  --默认值标准名称    
    FROM sys.columns C 
        INNER JOIN sys.objects O 
            ON C.[object_id]=O.[object_id] 
                AND O.type=‘U‘ 
                AND O.is_ms_shipped=0 
        INNER JOIN sys.types T 
            ON C.user_type_id=T.user_type_id 
        LEFT JOIN sys.default_constraints D 
            ON C.[object_id]=D.parent_object_id 
                AND C.column_id=D.parent_column_id 
                AND C.default_object_id=D.[object_id] 
    WHERE  C.is_identity=0 --非标识列
    AND C.is_computed= 0 --非计算列
    And  O.name IN ( ‘fxs_eshop_task‘) --表名
    --And  O.name IN ( ‘Ck_Proc_List‘,‘fxgw_sys_config‘,‘fxs_duizhang‘,‘Ck_CustomsDocking‘) --表名
    --And  C.name IN (‘Sort_Id‘,‘Type_Code‘)--字段名 Confirm_Time
    And  C.name IN (‘Confirm_Time‘,‘addTime‘,‘settlementbegintime‘,‘hone‘,‘CkNo‘)--字段名 
    AND (D.definition LIKE ‘%NULL%‘)  --获取为null的约束
    ORDER BY O.name,C.name
*/
--修正已有的默认值约束的名称为‘DF_‘ + 表名 + 字段名 
BEGIN TRAN 

    declare Cols_Cursor cursor FOR         
        SELECT 
        tabName= LOWER(O.name), --表名
        colName=LOWER(C.name), --字段名
        coltype= LOWER(T.name), --类型
        dfVal=ISNULL(D.definition,N‘‘),  --默认值
        dfName=ISNULL(D.name,N‘‘)    --默认值约束名称
         ,dfSName = (‘DF_‘ + O.name + ‘_‘ + C.name)  --默认值标准名称     
         
    FROM sys.columns C 
        INNER JOIN sys.objects O 
            ON C.[object_id]=O.[object_id] 
                AND O.type=‘U‘ 
                AND O.is_ms_shipped=0 
        INNER JOIN sys.types T 
            ON C.user_type_id=T.user_type_id 
        LEFT JOIN sys.default_constraints D 
            ON C.[object_id]=D.parent_object_id 
                AND C.column_id=D.parent_column_id 
                AND C.default_object_id=D.[object_id] 
    WHERE  C.is_identity=0 --非标识列
    AND C.is_computed= 0 --非计算列
    --And  O.name IN ( ‘fxs_eshop_task‘) --表名
--    --And  C.name IN (‘Sort_Id‘,‘Type_Code‘)--字段名 Confirm_Time
--    And  C.name IN (‘Confirm_Time‘,‘addTime‘,‘settlementbegintime‘,‘hone‘)--字段名 
    ORDER BY O.name,C.name
    open Cols_Cursor
    declare  @tabName varchar(200), @colName varchar(200), @coltype varchar(200), @dfVal varchar(200), @dfName varchar(200), @dfSName varchar(200)

    fetch next from Cols_Cursor into  @tabName , @colName , @coltype , @dfVal , @dfName , @dfSName 

    while(@@fetch_status=0)
      begin
        --print @tabName + @dfSName
        DECLARE @todo INT,@defaultVal VARCHAR(200),@sql VARCHAR(2000);
        SELECT @todo = 0,@defaultVal = ‘NULL‘,@sql = ‘‘;
        IF( @coltype = ‘money‘ OR @coltype = ‘real‘  OR @coltype = ‘int‘ OR @coltype = ‘decimal‘ OR @coltype = ‘smallint‘ OR @coltype = ‘numeric‘ OR @coltype = ‘tinyint‘ OR @coltype = ‘float‘ OR @coltype = ‘bigint‘ OR @coltype = ‘bit‘) --字符串类型
        BEGIN
            SELECT @todo = 1,@defaultVal = ‘‘‘‘‘‘;
        END
        ELSE IF ( (@coltype = ‘datetime‘ OR @coltype = ‘smalldatetime‘  OR @coltype = ‘datetime2‘) AND @colName = ‘addtime‘)--有些特殊的时间字段,比如发货时间、审核时间不要有默认值
        BEGIN
            SELECT @todo = 1,@defaultVal = ‘GETDATE()‘;
        END
        ELSE IF ( @coltype = ‘uniqueidentifier‘)
        BEGIN
            SELECT @todo = 1,@defaultVal = ‘NEWID()‘;
        END
        ELSE IF ( @coltype = ‘nchar‘ OR @coltype = ‘char‘  OR @coltype = ‘nvarchar‘  OR @coltype = ‘varchar‘  OR @coltype = ‘text‘  OR @coltype = ‘ntext‘ )
        BEGIN
            SELECT @todo = 1,@defaultVal = ‘‘‘‘‘‘;
        END        
        IF(@dfName = ‘‘)--无默认值约束
        BEGIN
            IF (@todo = 1)
            BEGIN
                SELECT @sql = ‘IF NOT exists (select * from sysobjects where id = object_id(N‘‘[‘ + @dfSName +‘]‘‘)) ALTER TABLE [‘ + @tabName + ‘] ADD CONSTRAINT ‘+@dfSName+‘ DEFAULT ‘+ @defaultVal +‘ FOR [‘+@colName+‘]‘ ;
                print ‘增加约束,‘ +@tabName + ‘表‘ + @colName + ‘无默认值约束,类型为‘ + @coltype + ‘,执行sql:‘ + @sql;
                EXEC(@sql); 
            END 
            ELSE
            BEGIN
                print ‘无约束但不增加,‘ +@tabName + ‘表‘ + @colName + ‘无默认值约束,类型为‘ + @coltype + ‘,不能修改;‘;
            END 
        END 
        ELSE
        BEGIN
            --约束名称不等于‘DF_‘ + 表名 + 字段名,默认值取原有的
            IF(@dfName <> @dfSName)
            BEGIN
                SELECT @defaultVal = @dfVal;
                SELECT @sql = ‘ALTER TABLE [‘ + @tabName + ‘] DROP CONSTRAINT [‘+@dfName + ‘];‘  --删除已有约束 
                SELECT @sql = @sql + ‘ IF NOT exists (select * from sysobjects where id = object_id(N‘‘[‘ + @dfSName +‘]‘‘)) ALTER TABLE [‘ + @tabName + ‘] ADD CONSTRAINT ‘+@dfSName+‘ DEFAULT ‘+ @defaultVal +‘ FOR [‘+@colName+‘] ‘ ;
                SELECT @sql = @sql + ‘ Else ALTER TABLE [‘ + @tabName + ‘] ADD CONSTRAINT ‘+ (@dfSName+ ‘2‘) +‘ DEFAULT ‘+ @defaultVal +‘ FOR [‘+@colName+‘] ‘ ;--考虑到某些表和字段加起来正好一样,所以再后面加2;
            
                print (‘重建约束,‘ +@tabName + ‘表‘ + @colName + ‘有默认值约束‘ + @dfName + ‘,默认值‘ +@dfVal + ‘;删除后重建约束,执行sql:‘ + @sql);
                EXEC(@sql); -- 
            END
            ELSE
            BEGIN
                print ‘维持约束不变,‘ + @tabName + ‘表‘ + @colName + ‘有默认值约束‘ + @dfName + ‘,默认值‘ +@dfVal + ‘;‘;
            END 
        END 
        fetch next from Cols_Cursor into  @tabName , @colName , @coltype , @dfVal , @dfName , @dfSName 
      end
    close Cols_Cursor
    deallocate Cols_Cursor
ROLLBACK

 

修正或添加字段默认值约束的名称

标签:object   identity   objects   tab   big   arch   没有   traints   表名   

原文地址:http://www.cnblogs.com/059212315/p/7544658.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!