我接管了一个数据库。似乎在某些时候默认数据库排序规则已更改。因此,某些列具有旧的默认排序规则,但在排序规则更改后添加的新列具有新的排序规则。此外,还有大量使用联合的存储过程代码。当代码执行时,我得到了
Cannot resolve collation conflict for column 5 in SELECT statement.
错误(例如,第一个SELECT返回排序规则A中的列,而第二个SELECT返回排序规则B中的列)。有没有办法编写一个SQL,例如选择排序 SQL_Latin1_General_CP1_CI_AS (旧整理)到新排序规则 Latin1_General_CI_AS 的所有列?
由于
答案 0 :(得分:4)
这样的事情可以解决问题
撰写一个alter table语句&每个不正确的列改变列语句
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
答案 1 :(得分:0)
更新
DECLARE
@sql nvarchar(4000),
@tablename sysname,
@schemaname 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(columns.object_id),
schemaname = SCHEMA_NAME(schema_id),
columns.name,
TYPE_NAME(user_type_id),
max_length,
is_nullable
FROM sys.columns
INNER JOIN sys.objects on columns.object_id = objects.object_id
WHERE
collation_name = 'SQL_Latin1_General_CP1_CI_AS'
OPEN cur_collations
FETCH NEXT FROM cur_collations INTO @tablename, @schemaname, @name, @datatype, @length, @is_nullable
WHILE (@@fetch_status -1) BEGIN
IF (@@fetch_status -2) BEGIN
SET @sql = N'ALTER TABLE ' + QUOTENAME(@schemaname) + '.' + 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)
PRINT @sql
END
FETCH NEXT FROM cur_collations INTO @tablename, @schemaname, @name, @datatype, @length, @is_nullable
END