适用于: 仅限多维
这些提示和指南有助于提高商业智能解决方案的可移植性,并避免与语言和排序规则设置直接相关的错误。
在整个堆栈中使用类似的排序规则
如果可能,请尝试在 Analysis Services 中使用用于数据库引擎的相同排序规则设置,努力实现宽度敏感度和区分大小写的对应关系,以及访问敏感度。
每个服务都有自己的排序规则设置,数据库引擎默认设置为SQL_Latin1_General_CP1_CI_AS,Analysis Services 设置为Latin1_General_AS。 默认值在大小写、宽度和重音敏感度方面兼容。 请注意,如果您更改其中任一排序规则的设置,当排序规则属性在根本方式上发生分歧时,可能会遇到问题。
即使排序规则设置在功能上是等效的,也可以遇到一个特殊情况,即字符串中的任何位置的空空间被每个服务以不同的方式解释。
空格字符是一种“特殊情况”,因为它可以表示为 Unicode 中的单字节(SBCS)或双字节字符集(DBCS)。 在关系引擎中,用空格分隔的两个复合字符串(一个使用 SBCS,另一个在 DBCS 中)被视为相同的。 在 Analysis Services 中,在处理期间,同一两个复合字符串不同,第二个实例将标记为重复。
有关更多详细信息和建议的解决方案,请参阅 在 Unicode 字符串中,排序中的空白处理结果不同。
常见排序规则建议
Analysis Services 始终提供所有可用语言和排序规则的完整列表;它不会根据所选语言筛选排序规则。 请务必选择一个可行的组合。
一些更常用的排序规则包括以下列表中的排序规则。
应将此列表视为进一步调查的起点,而不是排除其他选项的明确建议。 你可能会发现,不特别推荐的排序规则最适合你的数据。 彻底测试是验证数据值是否经过适当排序和比较的唯一方法。 与往常一样,在测试排序规则时,请务必同时运行处理和查询工作负荷。
Latin1_General_100_AS通常用于使用 ISO 基本拉丁字母表 26 个字符的应用程序。
包括斯堪的纳维亚字母(如 ø)的北欧语言可以使用Finnish_Swedish_100。
东欧语言(如俄语)经常使用Cyrillic_General_100。
中文和排序规则因区域而异,但通常为简体中文或繁体中文。
在中国和新加坡,Microsoft支持倾向于使用简体中文,并且拼音是首选的排序方式。 建议的排序规则为Chinese_PRC(适用于 SQL Server 2000)、Chinese_PRC_90(适用于 SQL Server 2005)或Chinese_Simplified_Pinyin_100(适用于 SQL Server 2008 及更高版本)。
在台湾,更为常见的是使用繁体中文,建议的排序顺序基于笔画数:中文_台湾_笔画(适用于 SQL Server 2000)、中文_台湾_笔画_90(适用于 SQL Server 2005)或中文_繁体_笔画计数_100(适用于 SQL Server 2008及更高版本)。
其他地区(如香港特别行政区和澳门特别行政区)也使用繁体中文。 对于排序规则,在香港特区,看到Chinese_Hong_Kong_Stroke_90(在 SQL Server 2005 上)并不罕见。 在澳门特别行政区,Chinese_Traditional_Stroke_Count_100(用于 SQL Server 2008 及之后的版本)使用频率较高。
对于日语,最常用的排序规则是Japanese_CI_AS。 Japanese_XJIS_100用于支持 JIS2004的安装。 Japanese_BIN2通常出现在数据迁移项目中,数据源自非 Windows 平台或 SQL Server 关系数据库引擎以外的数据源。
Japanese_Bushu_Kakusu_100 在运行 Analysis Services 工作负荷的服务器中很少出现。
建议对朝鲜语使用Korean_100。 尽管列表中仍有Korean_Wansung_Unicode可用,但已弃用它。
对象标识符的区分大小写
从 SQL Server 2012 SP2 开始,对象 ID 的区分大小写独立于排序规则强制执行,但行为因语言而异:
语言脚本 | 事例敏感性 |
---|---|
基本拉丁文字母 | 以拉丁字母(任何 26 个英语大写字母或小写字母)表示的对象标识符被视为不区分大小写,而不考虑排序方式。 例如,以下对象 ID 被视为相同:54321abcdef、54321ABCDEF、54321AbCdEf。 在内部,Analysis Services 将字符串中的字符视为大写,然后执行独立于语言的简单字节比较。 请注意,仅影响 26 个字符。 如果语言是西欧语,但使用斯堪的纳维亚字符,则额外字符不会被大写处理。 |
西里尔文,希腊语,科普特语,亚美尼亚语 | 非拉丁语双体脚本(如西里尔文)中的对象标识符始终区分大小写。 例如,Измерение 和 измерение 被视为两个不同的值,即使唯一的差异是第一个字母的情况。 |
对象标识符区分大小写的影响
只有对象标识符,而不是对象名称,才会受到表中描述的大小写行为的约束。 如果看到解决方案工作原理的变化(比较前后--安装 SQL Server 2012 SP2 或更高版本后),它很可能是一个处理问题。 查询不受对象标识符的影响。 对于两种查询语言(DAX 和 MDX),公式引擎使用对象名称(而不是标识符)。
注释
与区分大小写相关的代码更改对于某些应用程序来说是一项重大更改。 有关详细信息,请参阅 SQL Server 2014 中对 Analysis Services 功能的重大更改 。
使用 Excel、SQL Server Profiler 和 SQL Server Management Studio 进行区域设置测试
测试翻译时,连接必须指定翻译的 LCID。 如在 SSAS 中获取不同语言到 Excel所述,可以使用 Excel 来测试您的翻译结果。
为此,可以手动编辑 .odc 文件来包含区域标识符连接字符串属性。 使用 Adventure Works 示例多维数据库试试这个。
搜索现有的 .odc 文件。 当您找到 Adventure Works 的多维文件时,右键单击它,然后在记事本中打开。
将
Locale Identifier=1036
添加到连接字符串。 保存并关闭该文件。打开 Excel | 数据 | 现有连接。 筛选列表以仅显示此计算机上的连接文件。 查找 Adventure Works 的连接(仔细查看名称,可能有不止一个连接)。 打开连接。
应会看到 Adventure Works 示例数据库中的法语翻译。
作为后续步骤,你可以使用 SQL Server Profiler 来确认区域。 单击事件 Session Initialize
,然后查看下面的文本区域中的属性列表以查找 <localeidentifier>1036</localeidentifier>
。
在 Management Studio 中,您可以在服务器连接上指定区域标识符。
在对象资源管理器中 | 连接 | Analysis Services | 选项,单击“ 其他连接参数 ”选项卡。
输入
Local Identifier=1036
,然后单击“ 连接”。针对 Adventure Works 数据库执行 MDX 查询。 查询结果应为法语翻译。
在 SSMS 中执行包含法语翻译的 MDX 查询。
在包含翻译的解决方案中编写 MDX 查询
分析服务的对象名称可以通过翻译显示,但这些对象的标识符则不会被翻译。 尽可能使用 Analysis Services 对象的标识符和密钥,而不是翻译后的标题和名称。 例如,使用成员键而不是多维表达式(MDX)语句和脚本的成员名称,以确保跨多种语言的可移植性。
注释
请注意,无论排序规则如何,表格对象名称始终不区分大小写。 另一方面,多维对象名称遵循排序规则中的大小写敏感特性。 由于只有多维对象名称区分大小写,因此请确保引用多维对象的所有 MDX 查询都大小写正确。
编写包含日期和时间值的 MDX 查询
以下建议使基于日期和时间的 MDX 查询在不同语言中更易于移植:
使用数字部分进行比较和操作
执行月份和星期几比较和运算时,请使用数字日期和时间部分而不是字符串等效项(例如,使用 MonthNumberofYear 而不是 MonthName)。 数值受语言翻译差异的影响最小。
在结果集中使用字符串等效项
生成最终用户看到的结果集时,请考虑使用字符串(如 MonthName),以便多语言受众可以从提供的翻译中受益。
对通用日期和时间信息使用 ISO 日期格式
一位 Analysis Services 专家 提供此建议:“对于传入 SQL 或 MDX 中的查询的任何日期字符串,我始终使用 ISO 日期格式 yyyy-mm-dd,因为它明确,无论客户端或服务器的区域设置如何,我都会正常工作。 我会同意服务器在分析不明确的日期格式时应遵循其区域设置,但我也认为,如果你有一个不开放解释的选项,即无论如何,你最好选择它。
Use the Format function to enforce a specific format, regardless of regional language settings
以下 MDX 查询(从论坛文章中借用)说明了如何使用 Format 返回特定格式的日期,而不考虑基础区域设置。
有关原始 帖子,请参阅 SSAS 2012 生成无效日期(网络史蒂夫论坛帖子 )。
WITH MEMBER [LinkTimeAdd11Date_Manual] as Format(dateadd("d",15,"2014-12-11"), "mm/dd/yyyy") member [LinkTimeAdd15Date_Manual] as Format(dateadd("d",11,"2014-12-13"), "mm/dd/yyyy") SELECT { [LinkTimeAdd11Date_Manual] ,[LinkTimeAdd15Date_Manual] } ON COLUMNS FROM [Adventure Works]