Sql server 在SQLServer2005中使用批处理sql更改列排序规则
我接管了一个数据库。似乎在某个时候,默认数据库排序规则已更改。因此,某些列具有旧的默认排序规则,但更改排序规则后添加的新列具有新的排序规则。还有大量使用联合的存储过程代码。当代码执行时,我恰好得到Sql server 在SQLServer2005中使用批处理sql更改列排序规则,sql-server,sql-server-2005,tsql,collation,Sql Server,Sql Server 2005,Tsql,Collation,我接管了一个数据库。似乎在某个时候,默认数据库排序规则已更改。因此,某些列具有旧的默认排序规则,但更改排序规则后添加的新列具有新的排序规则。还有大量使用联合的存储过程代码。当代码执行时,我恰好得到 无法解决SELECT语句中第5列的排序规则冲突。 错误(例如,第一个选择返回排序规则A中的列,而第二个选择返回排序规则B中的列)。是否有一种方法可以编写一个SQL,例如选择所有列,将排序规则SQL\u Latin1\u General\u CP1\u CI\u作为(旧排序规则)选择为新排序规则Lati
无法解决SELECT语句中第5列的排序规则冲突。
错误(例如,第一个选择返回排序规则A中的列,而第二个选择返回排序规则B中的列)。是否有一种方法可以编写一个SQL,例如选择所有列,将排序规则SQL\u Latin1\u General\u CP1\u CI\u作为(旧排序规则)选择为新排序规则Latin1\u General\u CI\u作为
谢谢像这样的东西应该可以奏效
- 查找具有不正确排序规则的所有列
- 为每个不正确的列编写alter table语句和alter column语句
DECLARE @sql nvarchar(4000) , @tablename sysname , @name sysname , @datatype sysname , @length int , @precision int , @scale int , @is_nullable bit DECLARE cur_collations CURSOR LOCAL READ_ONLY FOR SELECT tablename = object_name(object_id) , name , TYPE_NAME(user_type_id) , max_length FROM sys.columns WHERE collation_name = 'SQL_Latin1_General_CP1_CI_AS' OPEN cur_collations FETCH NEXT FROM cur_collations INTO @tablename, @name, @datatype, @length WHILE (@@fetch_status <> -1) BEGIN IF (@@fetch_status <> -2) BEGIN set @sql = N' ALTER TABLE ' + QUOTENAME(@tablename) + N' ALTER COLUMN ' + QUOTENAME(@name) + N' ' + QUOTENAME(@datatype) + N'(' + cast(@length as nvarchar(10)) + N') COLLATE Latin1_General_CI_AS ' + case when @is_nullable = 1 then N'NULL' else N'NOT NULL' end + N' ' EXEC (@sql) END FETCH NEXT FROM cur_collations INTO @tablename, @name, @datatype, @length END CLOSE cur_collations DEALLOCATE cur_collations
DECLARE@sql-nvarchar(4000) ,@tablename sysname ,@name sysname ,@datatype sysname ,@length int ,@precision int ,@scale int ,@是可为空的位 声明当前排序规则游标本地只读 对于SELECT tablename=object\u name(object\u id) 名称 ,类型名称(用户类型id) ,最大长度 从sys.columns 其中排序规则名称='SQL\u拉丁1\u通用\u CP1\u CI\u AS' 开放cur_排序规则 从cur_排序规则获取下一个到@tablename、@name、@datatype、@length WHILE(@@fetch\u状态-1) 开始 如果(@@fetch_状态-2) 开始 设置@sql=N' 更改表'+QUOTENAME(@tablename)+N' 更改列'+QUOTENAME(@name)+N''+QUOTENAME(@datatype)+N'('+cast(@length as-nvarchar(10))+N') 核对拉丁语1_General_CI_AS “+当@is_nullable=1时,则N'NULL'否则N'NOT NULL'结束+N” EXEC(@sql) 终止 从cur_排序规则获取下一个到@tablename、@name、@datatype、@length 终止 关闭当前排序规则 取消分配cur_排序规则
- 查找具有不正确排序规则的所有列
- 为每个不正确的列编写alter table语句和alter column语句
DECLARE @sql nvarchar(4000) , @tablename sysname , @name sysname , @datatype sysname , @length int , @precision int , @scale int , @is_nullable bit DECLARE cur_collations CURSOR LOCAL READ_ONLY FOR SELECT tablename = object_name(object_id) , name , TYPE_NAME(user_type_id) , max_length FROM sys.columns WHERE collation_name = 'SQL_Latin1_General_CP1_CI_AS' OPEN cur_collations FETCH NEXT FROM cur_collations INTO @tablename, @name, @datatype, @length WHILE (@@fetch_status <> -1) BEGIN IF (@@fetch_status <> -2) BEGIN set @sql = N' ALTER TABLE ' + QUOTENAME(@tablename) + N' ALTER COLUMN ' + QUOTENAME(@name) + N' ' + QUOTENAME(@datatype) + N'(' + cast(@length as nvarchar(10)) + N') COLLATE Latin1_General_CI_AS ' + case when @is_nullable = 1 then N'NULL' else N'NOT NULL' end + N' ' EXEC (@sql) END FETCH NEXT FROM cur_collations INTO @tablename, @name, @datatype, @length END CLOSE cur_collations DEALLOCATE cur_collations
DECLARE@sql-nvarchar(4000) ,@tablename sysname ,@name sysname ,@datatype sysname ,@length int ,@precision int ,@scale int ,@是可为空的位 声明当前排序规则游标本地只读 对于SELECT tablename=object\u name(object\u id) 名称 ,类型名称(用户类型id) ,最大长度 从sys.columns 其中排序规则名称='SQL\u拉丁1\u通用\u CP1\u CI\u AS' 开放cur_排序规则 从cur_排序规则获取下一个到@tablename、@name、@datatype、@length WHILE(@@fetch\u状态-1) 开始 如果(@@fetch_状态-2) 开始 设置@sql=N' 更改表'+QUOTENAME(@tablename)+N' 更改列'+QUOTENAME(@name)+N''+QUOTENAME(@datatype)+N'('+cast(@length as-nvarchar(10))+N') 核对拉丁语1_General_CI_AS “+当@is_nullable=1时,则N'NULL'否则N'NOT NULL'结束+N” EXEC(@sql) 终止 从cur_排序规则获取下一个到@tablename、@name、@datatype、@length 终止 关闭当前排序规则 取消分配cur_排序规则
- 支持模式
- 正确实现是可为空的
- 支持模式
- 正确实现是可为空的