SQL Server 排序规则设置

问题描述 投票:0回答:1

在 SQL Server 中,默认排序规则是

SQL_Latin1_General_CP1_CI_AS
,以前,我曾经在每个查询末尾显式指定排序规则为
SQL_Latin1_General_CP1_CI_AI
,以在比较字符串时忽略重音符号。

现在,我想实现一个通用的解决方案,因此,我将数据库排序规则更改为

SQL_Latin1_General_CP1_CI_AI
但查询仍然无法工作,除非我显式指定排序规则! 我搜索了一些这个问题,我知道之前使用旧排序规则创建的列也必须更新为新排序规则,或者必须删除并再次重新创建!

有没有办法在不一一更新所有列的情况下处理这个问题?


这是我的查询示例 指定排序规则:

select * from Members where FirstName like '%cafe%' collate SQL_Latin1_General_CP1_CI_AI

不指定排序规则:

select * from Members where FirstName like '%cafe%'
sql-server string-comparison collation accent-insensitive
1个回答
0
投票

您可以使用以下代码生成脚本来更改所有表中所有列的排序规则:

DECLARE @fromCollation sysname = 'collation_name_here', @toCollation sysname = 'collation_name_here';

DECLARE @sql nvarchar(max);

SELECT
  CONCAT(
    'ALTER TABLE ',
    QUOTENAME(s.name),
    '.',
    QUOTENAME(t.name),
    ' ALTER COLUMN ',
    QUOTENAME(c.name),
    ' ',
    typ.name,
    '(',
    c.max_length,
    ') COLLATE ',
    @toCollation,
    IIF(c.is_nullable, ' NULL', ' NOT NULL')
  )
)
FROM sys.tables t
JOIN sys.schemas s ON s.schema_id = t.schema_id
JOIN sys.columns c ON c.object_id = t.object_id
JOIN sys.types typ ON typ.user_type_id = c.user_type_id
WHERE c.collation_name = @fromCollation
  AND typ.name IN ('varchar', 'nvarchar', 'char', 'nchar');
© www.soinside.com 2019 - 2024. All rights reserved.