修正或添加字段默認值約束的名稱
阿新 • • 發佈:2017-09-18
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 TON 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
修正或添加字段默認值約束的名稱