全半角空格导致的Sql Server Analysis Services处理错误(转载)
问题描述
某维度表的字符串列同时出现两条记录,A记录以半角空格(英文空格)结束,B记录以全角空格(中文空格)结束,除此之外其他部分均相同。Analysis Service处理的时候抛出“Key not found”的异常,导致处理失败。
为了实验,我们创建两张非常简单的表:
-- 员工交易事实表 Create Table [FactTransaction]( [TransactionKey] [int] not null, [EmployeeKey] [int] not null ) -- 员工维度表 Create Table [DimEmployee]( [EmployeeKey] [int]not null, [EmployeeName] [nvarchar](32) not null )
接着我们开始往维度表中添加几条记录。
insert into DimEmployee(EmployeeKey,EmployeeName)values(1,'员工 ') -- 半角空格 insert into DimEmployee(EmployeeKey,EmployeeName)values(2,'员工 ') -- 全角空格
然后我们在BIDS中新建一个Analysis Service的Olap工程,将DimEmployee表作为维度表,并新建指标TotalTransactions ::= Count(TransactionKey)表示每个员工的交易数量:
所有设置保持默认,OK,现在开始处理Employee维度。这个时候Analysis Service会提示你:
Processing Dimension Attribute 'EmployeeKey' failed. 1 rows have been read.
OLAP 存储引擎中存在错误: 处理时找不到以下属性键: 表:“dbo_DimEmployee”,列:“EmployeeName”,值:“员工 ”。该属性为“EmployeeName”。
这个错误翻译成英文就是Key not found.
问题分析
发生了什么事
在我们上面设计的OLAP方案中,一个EmployeeKey有且只能有一个EmployeeName,EmployeeKey属性的处理依赖于EmployeeName属性。这个依赖关系在维度设计视图中的Attribute Relationship属性关系面板中指定。
Analysis Service会在处理完EmployeeName属性之后再处理EmployeeKey属性。在处理每一个EmployeeKey属性成员的时候,都会去找对应的EmployeeName属性成员。
上面的处理错误实际上就是说,在处理EmployeeKey的某个成员的时候,它对应的EmployeeName属性成员应该是“员工 ”(全角空格)的——从表记录中可以看到这个对应关系——但是在属性存储文件(Analysis Service自己的存储结构)中却找不到该属性成员。
这里没有告诉我们到底是哪个EmployeeKey属性成员处理的时候出了问题,但是由于我们的数据仓库非常简单,我们可以直接看出来,EmployeeName=“员工 ”(全角空格)的EmployeeKey为2。
那为什么全角空格的EmployeeName属性成员没有导入到Analysis Service的属性存储文件中呢?我们来展开看一下处理EmployeeName时Analysis Service向Sql Server发起的查询。
SELECT DISTINCT [dbo_DimEmployee].[EmployeeName] AS [dbo_DimEmployeeEmployeeName0_0] FROM [dbo].[DimEmployee] AS [dbo_DimEmployee]
将这行代码放到Sql Server中去执行一下,我们发现sql Server只给我们返回了半角空格的记录,全角空格的记录被过滤掉了。这也就解释了,为什么全角空格的属性成员没能进入Analysis service中。进而导致依赖这个成员的属性处理失败。
Sql Server Collation
这里需要提一下Sql Server的排序规则(Collation)。排序规则会影响数据之间的比较以及顺序。具体细节参见MSDN:SQL Server Collation Fundamentals 。这里我只提一个和这个问题相关的,并且容易被人遗忘的设置,那就是Width-Sensitive(宽度敏感)设置。我们知道,有些字符既有单字节形式(半角字符),又有双字节形式(全角字符),例如1234和1234。如果设置为宽度不敏感,那么Sql Server就会将这些字符的单双字节形式一视同仁。这样你在select distinct的时候,单双字节字符形式的字符串就只能一个。这也就是为什么上面我们select distinct的时候只出来半角空格的缘故。
Sql Server和Analysis Service排序规则相同为什么还会出错?
Analysis Service自己也有一个排序规则的设置。我们检查了一下这两者的设置,发现是一样的。那么Analysis Service在查找“员工 ”(全角空格)属性成员的时候,即使找不到这个成员,但是应该至少可以匹配到“员工 ”(半角空格)的成员才是呀。关键是,半角空格的成员也根本不存在。默认情况下,所有字符串类型的维度属性在处理时都会被right trim,也就是结尾的空格均会被去除。
也就是说,最终进入Analysis Service的属性成员是“员工”,不带任何空格,而这个成员和全角空格(全角空格无法被right trimming掉)的显然无法匹配上。
发散一下
如果Analysis设置了对每个属性成员左右都trim的话,那么一旦数据仓库出现“ 员工”(左边带全角空格)和“ 员工”(左边带半角空格)的数据的时候,处理失败。
如果数据仓库中同时出现“员工”,“员工 ”(全角空格),那么也会造成出错,这是因为select distinct会将右侧空格去除之后再比较数据是否相等。
如果将维度属性的Trimming设置为None的话,那么当数据仓库中出现“员工”,“员工 ”(若干个半角空格结尾)这样数据的时候,也会造成处理失败,这也是为什么Analysis Service默认设置为right trimming的其中一个原因(和Sql Server的行为保持一致)。
如果数据中同时出现“员工 ”(半角空格),“员工 ”(全角空格),“员工 ”(先全角空格,再tab空格)这样的数据组合,处理正常。
总结
出现这样的情况,不好通过改变Sql Server或者Analysis Service的排序规则来修正这个问题。只能在ETL的阶段对此类数据进行预处理,将末尾的全角空格给剔除掉。如果业务系统对全半角的区别不感兴趣,也可以直接使用正则表达式将所有全角字符替换成相应的半角字符
全半角空格导致的Sql Server Analysis Services处理错误(转载)的更多相关文章
- 使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(七)
假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的功 ...
- SQL Server Analysis Services SSAS Processing Error Configurations
转载:https://www.mssqltips.com/sqlservertip/3476/sql-server-analysis-services-ssas-processing-error-co ...
- SQL Server Analysis Services 数据挖掘
假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多 电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的 ...
- SQL Server Analysis Services 数据挖掘(1)
来源: http://technet.microsoft.com/zh-cn/library/dn633476.aspx 假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多 电 ...
- Sql Server Analysis Service 处理时找到重复的属性键、找不到属性键错误(转载)
这是两个非常常见的SSAS处理异常,网上也能找到很多文章讲解决办法,但很少见关于异常原因的分析,先来看看第一个" OLAP 存储引擎中存在错误: 处理时找到重复的属性键",一个维度 ...
- 中文里带半角空格导致的Text换行问题[Unity]
0x01 问题 最近策划反映了个问题,游戏里的多行文本会出现提前换行的问题,如下图所示: 文本错误地提前换行,导致第一行文本后面有大块空白区域 通过观察可以发现,当字符串中带有半角空格,且半角空格后面 ...
- 充分利用 SQL Server Reporting Services 图表
最近在查SSRS的一些文章,看到MSDN在有一篇不错的文章,许多图表设置都有说明,共享给大家.. 其中有说明在SSRS中如果去写条件表达写和报表属性中的“自定义代码”,文章相对比较长,需要大家耐心的查 ...
- SQL Server Integration Services的10大最佳实践
原文出处:https://blogs.msdn.microsoft.com/sqlcat/2013/09/16/top-10-sql-server-integration-services-best- ...
- SQL Server Reporting Services本机模式下的权限管理
SQL Server Reporting Services在安装配置后,缺省只给BUILTIN\Administrators用户组(实际上只有本机的Administrator用户)提供管理权限.所以所 ...
随机推荐
- 最简单的PC机串口通信程序
把串口当作文件IO来操作,简单易行! 已验证,gcc和tcc都可以编译成功,并使用. 需注意,先有串口,改好红色字体串口号再编译运行! #include <stdio.h> #i ...
- 微信支付开发(1) 微信支付URL配置
由于微信支付接口更新,本文档已过期,请查看新版微信支付教程.地址 http://www.cnblogs.com/txw1958/category/624506.html 本文介绍微信支付申请时如何设置 ...
- 正确统计SQLServer的慢日志
RDS的一个富有吸引力的服务是为用户提供慢日志的运行状况报告.报告从不同的维度(总执行时间,总执行次数,总逻辑读,总物理读)为用户提供TOP20的SQL.RDS希望在为用户提供稳定,快速服务的同时,用 ...
- javaee学习之servlet
一.tomcat相关知识 tomecat虚拟主机与虚拟路径 1.tomcat的应用默认放在webapps目录下面,可以将其放在其他目录分区,让tomcat进行管理吗? 答:当然可以.方法:配置虚拟目录 ...
- VS2013+qt-vs-addin-1.2.4安装配置
--------------------------开头这部分可以跳过,仅作为笔记----------------------- 我问过的问题: http://www.codeproject.com/ ...
- REST Security with JWT using Java and Spring Security
Security Security is the enemy of convenience, and vice versa. This statement is true for any system ...
- 微信成为开发者C#代码
第一句话都会这么去写:程序猿就是苦逼,除了开发还要会写博文!今天咱就和大家探讨下如何让自己成为开发者!那么怎么才能成为开发者呢? 首先给大家一个微信的截图,看到这个截图,是不是有想去尝试的冲动?
- oracle开启numa的支持
在11.2中,即使是系统支持numa架构,oracle默认也不再检测硬件是否支持numa,也不开启对numa的支持. 要想开启对numa的支持,必须设置隐含参数: _enable_NUMA_suppo ...
- ajax提交含有html数据时的处理方法
这两天在做一个文章内修改的功能,由于前端选用的Extjs控件库,于是就使用Ext.form.HtmlEditor. 在使用ajax提交数据的时候,需要提交包含有html代码的数据.这时候问题就来了,不 ...
- #pragma message的作用
一般情况下,#pragma message( messagestring )是在编译期间,将一个文字串(messagestring)发送到标准输出窗口.典型的使用方法是在编译时报告和显示信息.下面的代 ...