在sql server 2005中使用批处理sql更改列排序规则

时间:2011-02-18 09:00:27

标签: sql-server sql-server-2005 tsql collation

我接管了一个数据库。似乎在某些时候默认数据库排序规则已更改。因此,某些列具有旧的默认排序规则,但在排序规则更改后添加的新列具有新的排序规则。此外,还有大量使用联合的存储过程代码。当代码执行时,我得到了

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 的所有列?

由于

2 个答案:

答案 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)

更新

  • 支持架构
  • 正确实施is_nullable

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