在 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%'
您可以使用以下代码生成脚本来更改所有表中所有列的排序规则:
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');