Jon*_*ult 5 t-sql multilingual collation
我有一个公用表,其中包含多语言CompanyName列(定义为nvarchar(512)).
我还有一个存储过程来搜索并返回公司列表,它需要2个nvarchar参数 - 一个是搜索词,另一个是ISO语言代码.
我希望能够做的是返回搜索结果,该搜索结果使用与第二个参数中提供的语言代码相对应的排序规则排序,例如:
SELECT * FROM dbo.Companies WHERE CompanyName LIKE '%searchstring%'
ORDER BY
CASE @lang
WHEN 'sv' THEN CompanyName COLLATE Sami_Sweden_Finland_100_CI_AI
WHEN 'ch' THEN CompanyName COLLATE Chinese_Simplified_Pinyin_100_CI_AI
ELSE CompanyName
END
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行它时出现以下错误:
无法解决CASE操作中"Chinese_Simplified_Pinyin_100_CI_AI"和"Sami_Sweden_Finland_100_CI_AI"之间的排序规则冲突.
这对我来说毫无意义 - 这不像我在整理排序,为什么会出现整理冲突?这是一个相互排斥的选择.
我试过不要太聪明,只是使用动态sql,不幸的是,这似乎是让数据库无法缓存执行计划,因此当表包含时,查询时间超过20秒(而不是1) 200万行.
我确信文化敏感排序必须是一个常见问题,是否有人知道一个不涉及改变当前模式的好解决方案(即必须创建其他列)?
一列只能有一种排序规则。CASE 意味着您试图拥有多个相互冲突的情况。尝试这个:
SELECT * FROM dbo.Companies WHERE CompanyName LIKE '%searchstring%'
ORDER BY
CASE @lang
WHEN 'sv' THEN CompanyName ELSE '' END
END COLLATE Sami_Sweden_Finland_100_CI_AI,
CASE @lang
WHEN 'ch' THEN CompanyName ELSE '' END
END Chinese_Simplified_Pinyin_100_CI_AI
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1734 次 |
| 最近记录: |