237.将所有的char、varchar改为nchar、nvarchar

此存储过程用于检查及转换 SQL Server 中指定表的字符类型字段为 Unicode 类型。它首先评估转换的可行性,考虑诸如计算列、默认值、主键和其他约束等因素。根据配置,该过程可以仅报告哪些字段可以转换,或者实际执行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE PROC p_ToUnicode
@type tinyint=0  --修改方式,0=仅查询可修改情况,1=仅所有列可修改时才修改,2=修改可修改列,报告不可修改列
AS
SET NOCOUNT ON
--查询非unicode列转换为unicode列的可行性
SELECT TableName=o.name,FieldName=c.name,
	FieldType=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('char','varchar')
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)
			+N' N'+FieldType
		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,FieldType,
	NoChangeCause=ISNULL(NoChangeCause,N'可以修改(或者已经修改成功)')
FROM #
ORDER BY CASE WHEN NoChangeCause IS NULL THEN 1 ELSE 0 END,TableName
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值