全局修改数据库字段类型create PROC p_typeTotype
全局修改数据库字段类型
@type tinyint=0,  --修改方式,0=仅查询可修改情况,1=仅所有列可修改时才修改,2=修改可修改列,报告不可修改列
全局修改数据库字段类型
@typefrom nvarchar(50),
全局修改数据库字段类型
@typeto nvarchar(50)
全局修改数据库字段类型
AS
全局修改数据库字段类型
SET NOCOUNT ON
全局修改数据库字段类型
--查询非unicode列转换为unicode列的可行性
全局修改数据库字段类型
SELECT TableName=o.name,FieldName=c.name,
全局修改数据库字段类型    CurrentFieldType
=t.name+N'('+CAST(c.prec as varchar)+N')'
全局修改数据库字段类型        
+CASE WHEN c.isnullable=1 THEN N'' ELSE N' NOT' END
全局修改数据库字段类型        
+N' NULL',
全局修改数据库字段类型    NoChangeCause
=CAST(STUFF(
全局修改数据库字段类型        
CASE WHEN COLUMNPROPERTY(c.id,c.name,N'IsComputed')=1
全局修改数据库字段类型            
THEN N',计算列' ELSE N'' END
全局修改数据库字段类型        
+CASE WHEN c.cdefault=0 THEN N'' ELSE N',列具有默认值' END
全局修改数据库字段类型        
+CASE WHEN EXISTS(
全局修改数据库字段类型                
SELECT * FROM sysindexkeys idxk,sysindexes idx
全局修改数据库字段类型                
WHERE idxk.id=c.id 
全局修改数据库字段类型                    
AND idxk.colid=c.colid
全局修改数据库字段类型                    
AND idxk.id=idx.id
全局修改数据库字段类型                    
AND idxk.indid=idx.indid
全局修改数据库字段类型                    
AND idx.indid NOT IN(0,255)
全局修改数据库字段类型                    
AND INDEXPROPERTY(idx.id,idx.name,N'IsAutoStatistics')=0)
全局修改数据库字段类型            
THEN N',列被主键、唯一键、索引、STATISTICS引用' ELSE N'' END
全局修改数据库字段类型        
+CASE WHEN EXISTS(
全局修改数据库字段类型                
SELECT * FROM sysforeignkeys WHERE fkeyid=c.id AND fkey=c.colid)
全局修改数据库字段类型            
THEN N',列被外键约束引用' ELSE N'' END
全局修改数据库字段类型        
+CASE WHEN EXISTS(
全局修改数据库字段类型                
SELECT * FROM sysobjects oc,sysdepends d
全局修改数据库字段类型                
WHERE oc.parent_obj=o.id
全局修改数据库字段类型                    
AND OBJECTPROPERTY(oc.id,N'IsCheckCnst')=1
全局修改数据库字段类型                    
AND d.id=oc.id
全局修改数据库字段类型                    
AND d.depnumber=c.colid)
全局修改数据库字段类型            
THEN N',列被CHECK约束引用' ELSE N'' END,1,1,N''as nvarchar(4000))
全局修改数据库字段类型
INTO # FROM sysobjects o,syscolumns c,systypes t
全局修改数据库字段类型
WHERE o.id=c.id and o.status>=0
全局修改数据库字段类型    
AND OBJECTPROPERTY(o.id,N'IsUserTable')=1
全局修改数据库字段类型    
AND t.xusertype=c.xusertype
全局修改数据库字段类型    
AND t.name in(@typefrom)
全局修改数据库字段类型
IF @@ROWCOUNT=0 RETURN
全局修改数据库字段类型
全局修改数据库字段类型
--如果需要,修改非unicode列为unicode列
全局修改数据库字段类型
IF @type=2 OR NOT EXISTS(SELECT * FROM # WHERE NoChangeCause>'')
全局修改数据库字段类型
BEGIN
全局修改数据库字段类型    
SET XACT_ABORT ON
全局修改数据库字段类型    
BEGIN TRAN
全局修改数据库字段类型        
DECLARE tb CURSOR LOCAL
全局修改数据库字段类型        
FOR
全局修改数据库字段类型        
SELECT N'ALTER TABLE '+QUOTENAME(TableName)
全局修改数据库字段类型            
+N' ALTER COLUMN '+QUOTENAME(FieldName)
全局修改数据库字段类型            
+ @typeto
全局修改数据库字段类型        
FROM #
全局修改数据库字段类型        
WHERE NoChangeCause IS NULL
全局修改数据库字段类型        
DECLARE @sql nvarchar(4000)
全局修改数据库字段类型        
OPEN tb
全局修改数据库字段类型        
FETCH tb INTO @sql
全局修改数据库字段类型        
WHILE @@FETCH_STATUS=0
全局修改数据库字段类型        
BEGIN
全局修改数据库字段类型            
EXEC sp_executesql @sql
全局修改数据库字段类型            
FETCH tb INTO @sql
全局修改数据库字段类型        
END
全局修改数据库字段类型        
CLOSE tb
全局修改数据库字段类型        
DEALLOCATE tb
全局修改数据库字段类型    
COMMIT TRAN
全局修改数据库字段类型
END
全局修改数据库字段类型
全局修改数据库字段类型
--显示不能修改的列
全局修改数据库字段类型
SELECT TableName,FieldName,CurrentFieldType,
全局修改数据库字段类型    NoChangeCause
=ISNULL(NoChangeCause,N'可以修改(或者已经修改成功)')
全局修改数据库字段类型
FROM #
全局修改数据库字段类型
ORDER BY CASE WHEN NoChangeCause IS NULL THEN 1 ELSE 0 END,TableName
全局修改数据库字段类型
全局修改数据库字段类型
GO
全局修改数据库字段类型

相关文章:

  • 2021-11-20
  • 2021-08-20
  • 2022-12-23
  • 2021-12-19
  • 2021-11-28
  • 2021-12-08
  • 2021-11-20
猜你喜欢
  • 2021-11-28
  • 2021-11-20
  • 2021-12-10
  • 2021-12-28
  • 2022-01-05
  • 2021-11-28
  • 2021-11-17
相关资源
相似解决方案