从所有数据库列中删除排序规则

ama*_*eur 4 sql-server sql-server-2012

我有一个 SQL Server 数据库,其中设置了排序规则。但是我遇到了问题,因为数据库中某些列的排序规则与数据库排序规则不同。

我想从列中删除排序规则并使用数据库上的排序规则集。

我正在使用 SQL Server 2012。

我怎样才能做到这一点?脚本可以做到这一点吗?

mar*_*c_s 14

使用此处的脚本,您可以找到与数据库默认值不匹配的所有列:

DECLARE @DatabaseCollation VARCHAR(100)

SELECT 
    @DatabaseCollation = collation_name 
FROM 
    sys.databases
WHERE 
    database_id = DB_ID()

SELECT 
    @DatabaseCollation 'Default database collation'

SELECT 
    t.Name 'Table Name',
    c.name 'Col Name',
    ty.name 'Type Name',
    c.max_length,
    c.collation_name,
    c.is_nullable
FROM 
    sys.columns c 
INNER JOIN 
    sys.tables t ON c.object_id = t.object_id
INNER JOIN 
    sys.types ty ON c.system_type_id = ty.system_type_id    
WHERE 
    t.is_ms_shipped = 0
    AND 
    c.collation_name <> @DatabaseCollation
Run Code Online (Sandbox Code Playgroud)

对于这些列中的每一列,您可以执行这个简单的命令将它们的排序规则更改为数据库默认值:

ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(50) COLLATE DATABASE_DEFAULT
Run Code Online (Sandbox Code Playgroud)

如果你真的想要,你也可以将两者结合起来 -SELECT在第一个脚本的语句上使用游标,然后迭代结果并为找到的每一列执行第二个语句 - 我通常更喜欢手动执行此操作,以便更清楚我在做什么(以及我改变了多少):

  • 需要注意的一件事:您不能更改作为索引或约束一部分的列的排序规则。您需要先删除索引/约束,然后才能更改排序规则 - 这需要更多的脚本编写。 (3认同)