当属性不是键时,“重复属性键”错误

时间:2011-08-17 21:40:25

标签: ssas

处理Dimension时出现以下错误:

  

OLAP存储引擎中的错误:重复的属性键已经存在   处理时发现:表:'dbo_Orders',列:'项目',值:   '客户服务的东西'。该属性为“项目”。

'Project'是'Orders'维度的属性,但不是键。我没有在任何地方指出Project列是关键!我应该能够根据需要获得尽可能多的重复项,就像名字字段一样。

我是Analysis Services项目的新手,并且确实需要了解SSAS在重复值时始终抱怨重复值的事实。我敢肯定,这一定是我忽略的简单事情。

修改:我意识到可以设置KeyDuplicate = ReportAndContinue/ReportAndStop,也可以设置KeyColumnsNameColumns。但是这个多步骤过程似乎非常麻烦,看起来应该是一个非常正常的操作,比如添加Address1,Address2,Address3,Firstname,Zipcode和其他通常重复的字段。我不敢相信这个繁琐的过程需要应用于所有这些领域吗?

提前致谢。

17 个答案:

答案 0 :(得分:43)

这通常是源表/视图中同时包含空格和NULL的结果。

基本上,SSAS为每个属性执行此操作 SELECT DISTINCT COALESCE(attr,'')FROM SOURCE

默认情况下,Analysis Services会将NULL转换为空格,从而导致生成的Feed中出现重复的值空白 - 因此出现错误。

我同意这很糟糕,对新球员来说是一个很大的痛苦。

解决方案:从数据源中删除所有空值,例如,在所有位置使用ISNULL / COALESCE,或者使用where子句过滤掉包含null的行,或者在处理多维数据集之前运行update语句将所有空值替换为值< / p>

答案 1 :(得分:13)

右键单击该属性,然后选择“属性”。在“属性”窗口中找到位于“源”类别下的“KeyColumn”。编辑“KeyColumn”属性,它将显示一个用户友好的窗口。

从窗口右侧(Key Columns)侧删除属性,并将其替换为左侧(Available Columns)侧的实际id列。

然后编辑“NameColumn”属性,将出现相同的窗口。将属性列(您要显示的实际数据)从左侧移动到右侧。

在VS 2010 Shell SSDT中测试。

答案 2 :(得分:11)

我遇到了同样的问题,属性中没有空白或NULL值。 经过一些分析,我发现一些字符串最后有换行符。因此,如果属性的2个值几乎相同,但其中一个在结尾处有换行符,而另一个没有,则SSAS会引发“重复属性键”错误。
可以通过从属性中删除换行符来修复它。
我使用以下定义创建了计算列:

REPLACE(REPLACE(ISNULL([AttributeColumn], ''), CHAR(13), ''), CHAR(10), '')

我在立方体中使用了这个计算列,错误消失了。

答案 3 :(得分:6)

今天发生在我身上的事情让我头疼了一会儿,因为这里的解决方案都没有。终于解决了它,并认为我会为其他任何人添加我的解决方案谷歌搜索这个错误并像我一样到达这里。

在我的情况下,它不是NULL和空字符串,因为我已将[NullProcessing]值设置为“UnknownMember”。相反,它是[修剪]值,在我的情况下,它被设置为“正确”。

虽然我知道我是如何解决的(?)但我不是100%的原因,但我假设当SQL Server执行SELECT DISTINCT(col) FROM source并且[Trimming]值设置为这样时,Analysis服务器稍后会删除最后的标签字符(例如,SQL Server中的RTRIM没有),最后是重复项。

因此将[修剪]设置为“无”可能会解决它,因为选项卡是我不需要的数据(我的数据是从外部源解析/读取/输入的)我只是替换了列中的选项卡,然后处理了立方体又好了。

答案 4 :(得分:5)

虽然我在此页面上的其他解决方案可行(并且根据情况可能更为理想),但这是另一种解决方案:

这是我的错误的一部分:

Column: 'attribute1_name', Value: 'Search String'

我快速搜索:

SELECT dim_id,
       dim_name,
       dim_attribute1.id,
       dim_attribute1.name,
       dim_attribute2.id,
       dim_attribute2.name
  FROM dim_table
    INNER JOIN dim_attribute1 ON dim.attribute1_id = dim_attribute1.id
    INNER JOIN dim_attribute2 ON dim.attribute2_id = dim_attribute2.id
 WHERE UPPER(dim_attribute1.name) = UPPER('Search String')

事实证明,dim_attribute1.name有两个不同的条目,与之匹配:

  1. 搜索字符串
  2. 搜索字符串
  3. 第一个解决方案将它们分开,没有问题,因此它是一个有效的解决方案(加上性能奖励)。但是,替代方案(如果要将文本值保留为键)则更改排序规则:

    Key Columns → Column Name → Source → Collation
    

    包括'区分大小写'。

    其他类似的问题可能是空白字符和其他容易发现文本中的细微变化。

答案 5 :(得分:2)

今天我遇到了类似的问题(同样的错误信息),为了其他人来到这里我遇到同样的问题我在我的维基上写了一些笔记:http://www.david-halliday.co.uk/wiki/doku.php?id=databases:oracle&#select_dates_for_ssas_include_hierarchy

我的案例是SQL(简化和改写以捍卫无辜者):

SELECT dim_id,
       dim_name,
       dim_attribute1.name,
       dim_attribute2.name
  FROM dim_table
    INNER JOIN dim_attribute1 ON dim.attribute1_id = dim_attribute1.id
    INNER JOIN dim_attribute2 ON dim.attribute2_id = dim_attribute2.id

奇怪的是,dim_attribute1_name但不是dim_attribute2_name的某些情况发生了错误。但是,这种特殊情况的属性完全相同。最后,解决方案是将SQL更改为:

SELECT dim_id,
       dim_name,
       dim_attribute1.id,
       dim_attribute1.name,
       dim_attribute2.id,
       dim_attribute2.name
  FROM dim_table
    INNER JOIN dim_attribute1 ON dim.attribute1_id = dim_attribute1.id
    INNER JOIN dim_attribute2 ON dim.attribute2_id = dim_attribute2.id

然后在维度(隐藏列表中的ID)中使用属性键的id值和属性名称的名称。我之前没见过,但由于某种原因它发生在这里。我认为这个解决方案比设置多维数据集来处理忽略重复键错误更好。

我认为如果构建一个连接表的维度,这将提供更好的性能/可靠性。但请不要引用我。

答案 6 :(得分:2)

我遇到了同样的问题,我找到了解决方法。

右键单击&#34; Cube&#34; =&GT; &#34;处理&#34; =&GT; &#34;更改设置&#34; =&GT; &#34;尺寸键错误&#34;

有效&#34;用户自定义错误配置&#34;

设置&#34;忽略错误&#34;这四个下拉列表 &#34;未找到密钥&#34; &#34;重复密钥&#34; &#34;空键转换为未知&#34; &#34;不允许空密钥&#34;

键的问题将被忽略。

答案 7 :(得分:2)

在我玩了一个属性的键列中添加ID后,我遇到了问题。我之后删除了密钥,但发现处理过程中的select语句仍然引用了ID,使得该属性不唯一。我无法通过属性属性找到解决此问题的方法,因此我删除了整个Dimension并重新创建了它。这解决了这个问题。

答案 8 :(得分:0)

Endy:一种解决方案是从维度设计器(问题属性的KeyColumns属性)更改SSAS处理空值的方式。通常,我将NullProcessing子属性设置为UnknownMember。 –

(点数应分配给Endy)

答案 9 :(得分:0)

为防止它对像我这样的其他准新手有帮助,我将概述一种解决方案,在尝试部署跨越多年的Date维度时遇到“重复属性键”错误消息后,我终于找到了解决方案。该错误消息表明,例如,我的CalendarQuarter属性中有重复的属性键。最初让我感到困惑,因为每个完整的年份都有四个季度(即1、2、3和4),所以我当然有重复的。终于让我意识到这就是问题所在,换句话说(与该线程的标题相反),属性是键。我通过在DSV的日期表中添加名为“ CalendarQuarterKey”的计算列来解决此问题,以为CalendarQuarter属性生成唯一键,例如2017年第一季度为“ 20171”而不是“ 1”,2017年第二季度为“ 20172”,而不仅仅是“ 2”,依此类推。具有我的CalendarMonth属性的同上:每个完整年份都有十二个月(即1、2、3 ... ,11,12)因此,我当然也在那里重复了。相同的解决方案:我在DSV的日期表中添加了名为“ CalendarMonthKey”的计算列,以生成CalendarMonth属性的唯一键,例如2017年1月是“ 201701”,而不是“ 1”,2017年2月是“ 201702”,而不是“ 2”,等等。然后,我将新的“ CalendarQuarterKey”和“ CalendarMonthKey”列用作CalendarQuarter和CalendarMonth的KeyColumn属性。这可能不是首选的解决方案,但它对我有用,我终于可以恢复构建多维数据集了。

答案 10 :(得分:0)

以上都不对我有帮助。有效的方式与Eric W.的建议类似。

我必须为我的属性设置多个“关键列”。例如,属性“城市”需要键列“国家/地区”,“州”和“城市”。

此处有更多信息:https://www.mssqltips.com/sqlservertip/3271/sql-server-analysis-server-ssas-keycolumn-vs-namecolumn-vs-valuecolumn/

答案 11 :(得分:0)

由于各种原因,我多次遇到此错误,但最近遇到了一个相当模糊的原因:文本列中存在betaß字符。尽管列中的数千个独特单词在太阳下使用了每个模糊ASCII码的大杂烩,但SSAS仅在处理包含ß符号的列值时才会阻塞。系统地排除了无效,重复,修剪等等。这很可能与MSDN thread SSAS 2012 duplicate key error with 'ss' and 'ß'中讨论的深不可测和未解决的问题有关,其中SSAS将ß值解释为'ss',因为某些不可理解的原因,即使整理设置正确也是如此。在我的例子中,在SSAS列属性中设置Collat​​ion以匹配关系端的源列的SQL_Latin1_General_CP1_CS_AS排序规则并没有解决这个问题。我还必须更改整个服务器的排序规则。在其他列依赖于不同的排序规则的某些环境中,这种解决方法可能会很痛苦,但是在我的情况下它绕过了这个问题,并允许我毫不费力地处理维度。我希望这有助于下一个人偶然发现同样的“陷阱”。

答案 12 :(得分:0)

有些时候需要在keyColumns中使用复合键来解析重复属性键

答案 13 :(得分:0)

如果您仍想继续进行部署,那么Lemme会为您提供解决方法。立方体浏览。 在“进程多维数据集”窗口下,将维度键错误设置更改为自定义。 您将能够无缝部署&amp;浏览多维数据集。 这里的权衡是你可能得不到你期望的结果。

答案 14 :(得分:0)

请阅读此博客:a duplicate attribute key has been found...。看看原因的长解释1.它将解释为什么会发生这种情况。

谢谢你们

奈德

答案 15 :(得分:0)

如果您的数据同时包含NULL并且''SSAS发出重复的属性键,因为它认为NULL为''。您无需触摸数据即可解决此问题。您可以转到数据源视图并使用表达式COALESCE(mycolumn,'')添加命名计算,然后在维度而不是原始列中使用它。这将解决数据源视图级别的问题,维度将处理正常。

答案 16 :(得分:0)

我通过在关系数据库的视图上指定COLLATION来解决,如下所示。

COALESCE([DescriçãodaTransação],'')COLLATE Latin1_General_CI_AI