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

问题描述 投票:43回答:17

处理Dimension时出现以下错误:

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

“项目”是“订单”维度的属性,但不是密钥。我没有在任何地方指出Project列是关键!我应该能够根据需要拥有尽可能多的副本,就像名字字段一样。

我是Analysis Services项目的新手,并且确实需要克服SSAS经常抱怨重复值的事实,因为重复值应该完全没问题。我敢肯定,这一定是我忽略的简单事情。

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

提前致谢。

ssas
17个回答
44
投票

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

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

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

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

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


0
投票

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

COALESCE([交易描述],'')COLLATE Latin1_General_CI_AI


0
投票

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


0
投票

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

多谢你们


0
投票

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


0
投票

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


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排序规则并没有解决这个问题。我还必须更改整个服务器的排序规则。在其他列依赖于不同的排序规则的某些环境中,这种解决方法可能会很痛苦,但是在我的情况下它绕过了这个问题,并允许我毫不费力地处理维度。我希望这有助于下一个人偶然发现同样的“陷阱”。


0
投票

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


14
投票

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

从窗口的右侧(键列)侧删除该属性,并将其替换为左侧(可用列)侧的实际id列。

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

在VS 2010 Shell SSDT中测试过。


11
投票

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

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

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


6
投票

刚刚发生在我身上的事情发生在我身上一段时间,因为这里的解决方案都没有奏效。终于解决了它,并认为我会为其他人添加我的解决方案谷歌搜索这个错误并像我一样到达这里。

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

虽然我知道我如何解决(?)它我不是100%的原因,但我假设当SQL Server执行它的SELECT DISTINCT(col) FROM source并且[修剪]值设置为这样时,分析服务器稍后从其中删除选项卡字符结束(例如SQL Server中的RTRIM没有)并最终得到重复项。

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


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. 搜索字符串

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

Key Columns → Column Name → Source → Collation

包括'区分大小写'。

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


3
投票

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

右键单击“Cube”=>“Process”=>“更改设置”=>“尺寸键错误”

有效的“用户自定义错误配置”

为此四个下拉列表设置“忽略错误”“未找到密钥”“重复密钥”“空密钥转换为未知”“不允许空密钥”

键的问题将被忽略。


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值和属性名称的名称。我之前没见过,但由于某种原因它发生在这里。我认为这个解决方案比设置多维数据集来处理忽略重复键错误更好。

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


2
投票

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


1
投票

以上都没有为我解决。有效的方法与Eric W.建议的类似。

我必须为我的属性设置多个键列。例如,属性“City”需要键列“Country”,“State”和“City”。

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

© www.soinside.com 2019 - 2024. All rights reserved.