USE[master]
GO
ALTERDATABASE[TZToolDB]SET SINGLE_USER WITHROLLBACK IMMEDIATE
GO
ALTERDATABASE[TZToolDB]COLLATE Latin1_General_CI_AS
GO
USE[master]
GO
ALTERDATABASE[TZToolDB]SET multi_user WITHROLLBACK IMMEDIATE
GO
2.4. 修改表排序规则
USE[master];
GO
ALTERDATABASE 数据库名 SET SINGLE_USER WITHROLLBACK IMMEDIATE;
GO
USE 数据库名;
GO
DECLARE@Collate NVARCHAR(50)= N'Latin1_General_CI_AS';--排序规则名DECLARE@table NVARCHAR(128);--循环Item表名DECLARE@column NVARCHAR(128);--循环Item字段名DECLARE@type NVARCHAR(128);--对应字段的类型,char、nchar、varchar、nvarchar等DECLARE@typeLenght NVARCHAR(128);--对应类型的长度,nchar、nvarchar需要将数值除于2DECLARE@sql NVARCHAR(MAX);--要拼接执行的sql语句SETROWCOUNT0;SELECTNULL mykey, c.name, t.name AS[Table], c.name AS[Column], c.collation_name AS[Collation],
TYPE_NAME(c.system_type_id)AS[TypeName], c.max_length AS[TypeLength]INTO#tempFROM sys.columns c
RIGHTJOIN sys.tables t ON c.object_id = t.object_id
WHERE c.collation_name ISNOTNULL;-- AND t.name = 'SysLog'-- AND TYPE_NAME(c.system_type_id) = 'nvarchar';SETROWCOUNT1;UPDATE#tempSET mykey =1;WHILE @@ROWCOUNT>0BEGINSETROWCOUNT0;--每次查询第一条记录并赋值到对应变量中SELECT@table=[Table],@column=[Column],@type= TypeName,@typeLenght= TypeLength
FROM#tempWHERE mykey =1;--nchar、nvarchar需要将数值除于2IFCONVERT(INT,@typeLenght)>0AND(@type='nvarchar'OR@type='nchar')BEGINSET@typeLenght=CONVERT(NVARCHAR(128),CONVERT(INT,@typeLenght)/2);END;IF@typeLenght='-1'BEGINSET@typeLenght= N'max';END;--拼接sql,注意表名、字段名要带[],避免Group等关键字SET@sql= N' ALTER TABLE ['+@table+ N'] ALTER COLUMN ['+@column+ N'] '+@type+ N'('+@typeLenght+ N') COLLATE '+@Collate;--Try执行BEGIN TRY
EXEC(@sql);END TRY
--Catch查询异常结果BEGIN CATCH
SELECT@sqlAS[ASL], ERROR_MESSAGE()AS msg;END CATCH;DELETE#tempWHERE mykey =1;SETROWCOUNT1;UPDATE#tempSET mykey =1;END;SETROWCOUNT0;DROPTABLE#temp;USE[master];
GO
ALTERDATABASE 数据库名 SET MULTI_USER WITHROLLBACK IMMEDIATE;
GO