1. 程式人生 > >修正或添加字段默認值約束的名稱

修正或添加字段默認值約束的名稱

lec cursor where lower blog 字符串 不變 get big

舊項目中的數據庫約束名稱不規範,寫了個腳本重新修改。

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

修正或添加字段默認值約束的名稱