动态更新数据库中所有字段的整理

Rus*_*ell 31 sql-server-2008

我们最近将数据库从SQL Server 2005服务器移动到SQL Server 2008服务器.一切都很好,但现在我们发现我们正在收集整理冲突.旧服务器与新服务器具有不同的排序规则.

现在我们在移动之前创建的表是一个排序规则,之后创建的表是另一个排序规则.

有没有办法用旧的排序规则更新表格/列到新的排序规则?

我理解设置默认数据库/服务器排序规则不会修改任何现有表(链接).如果我不需要,我真的不想重新创建数据库.

任何帮助真的很感激.

UPDATE

感谢您的帮助,终于让它工作了.

为了将来参考,这是我的最终脚本:

SELECT 'ALTER TABLE [' + SYSOBJECTS.Name + '] ALTER COLUMN [' + SYSCOLUMNS.Name + '] ' +
SYSTYPES.name + 
    CASE systypes.NAME
    WHEN 'text' THEN ' '
    ELSE
    '(' + RTRIM(CASE SYSCOLUMNS.length
    WHEN -1 THEN 'MAX'
    ELSE CONVERT(CHAR,SYSCOLUMNS.length)
    END) + ') ' 
    END

    + ' ' + ' COLLATE Latin1_General_CI_AS ' + CASE ISNULLABLE WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END
    FROM SYSCOLUMNS , SYSOBJECTS , SYSTYPES
    WHERE SYSCOLUMNS.ID = SYSOBJECTS.ID
    AND SYSOBJECTS.TYPE = 'U'
    AND SYSTYPES.Xtype = SYSCOLUMNS.xtype
    AND SYSCOLUMNS.COLLATION IS NOT NULL
    AND NOT ( sysobjects.NAME LIKE 'sys%' )
    AND NOT ( SYSTYPES.name LIKE 'sys%' )
    GO
Run Code Online (Sandbox Code Playgroud)

这是包含我基于它的脚本的站点.我不得不调整它以使其正常工作.

小智 10

万一有人看着这个使用SQL Server 2008,我不得不做一些修改:

SELECT 'ALTER TABLE [' + sys.objects.name + '] ALTER COLUMN ['
+ sys.columns.name + '] ' + sys.types.name + 
    CASE sys.types.name
    WHEN 'text' THEN ' '
    ELSE
    '(' + RTRIM(CASE sys.columns.max_length
    WHEN -1 THEN 'MAX'
    ELSE CONVERT(CHAR,sys.columns.max_length)
    END) + ') ' 
    END

    + ' ' + ' COLLATE Latin1_General_BIN ' + CASE sys.columns.is_nullable WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END
    FROM sys.columns , sys.objects , sys.types
    WHERE sys.columns.object_id = sys.objects.object_id
    AND sys.objects.TYPE = 'U'
    AND sys.types.system_type_id = sys.columns.system_type_id
    AND sys.columns.collation_name IS NOT NULL
    AND NOT ( sys.objects.NAME LIKE 'sys%' )
    AND NOT ( sys.types.name LIKE 'sys%' )
Run Code Online (Sandbox Code Playgroud)


OMG*_*ies 6

您可以使用ALTER DATABASE语句的COLLATE子句更改在用户数据库中创建的任何对象的排序规则.这种说法也没有改变列的排序规则中的任何现有用户定义的表.可以使用ALTER TABLE的COLLATE子句更改这些内容.

参考:设置和更改数据库排序规则

如果列太多,则可以循环访问SYS.COLUMNS以应用ALTER TABLE语句.

  • 哈哈,您在评论中一步步重写了整个答案。 (2认同)

小智 5

怎么样:

DECLARE @collation NVARCHAR(64)
SET @collation = 'Latin1_General_CI_AS'

SELECT
    'ALTER TABLE [' + TABLE_SCHEMA  + '].[' + TABLE_NAME + '] '
  + 'ALTER COLUMN [' + COLUMN_NAME + '] '
  + DATA_TYPE + '(' + CASE CHARACTER_MAXIMUM_LENGTH 
        WHEN -1 THEN 'MAX' 
        ELSE CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) END + ') '
  + 'COLLATE ' + @collation + ' '
  + CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE 'NULL' END
FROM INFORMATION_SCHEMA.columns
WHERE  COLLATION_NAME IS NOT NULL
AND COLLATION_NAME <> @collation
Run Code Online (Sandbox Code Playgroud)