【问题标题】:"Duplicate attribute key" error when attribute is not a key属性不是键时出现“重复的属性键”错误
【发布时间】:2011-10-29 07:35:50
【问题描述】:

处理维度时出现以下错误:

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

“项目”是“订单”维度的属性,但不是键。我没有在任何地方指出项目列是关键!我应该可以有尽可能多的重复项,就像名字字段一样。

我是 Analysis Services 项目的新手,我确实需要克服这样一个事实,即 SSAS 一直在抱怨重复值,而拥有重复值应该是完全可以的。我敢肯定,这一定是我忽略的简单事情。

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

提前致谢。

【问题讨论】:

    标签: ssas


    【解决方案1】:

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

    本质上,SSAS 对每个属性都执行此操作 从源中选择 DISTINCT COALESCE(attr,'')

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

    我同意这很糟糕,对新玩家来说是一个主要的痛苦。

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

    【讨论】:

    • @NTDLS 一种解决方案是从维度设计器(问题属性的 KeyColumns 属性)更改 SSAS 处理 null 的方式。通常我将 NullProcessing 子属性设置为 UnknownMember。
    • Endy,您的第一个解决方案非常有效。你能把它作为答案发布(你会得到我的投票)吗?似乎答案不应该埋在评论中。接受的答案是一个很好的解释,但它并没有真正包含解决方案。
    • 我不同意 SSAS 使用SELECT DISTINCT COALESCE(attr, '')。问题是它在没有COALESCE 的情况下执行SELECT DISTINCT,然后将空值转换为导致重复的空白。
    • 我完全不明白这与空值有何关系。我没有空值,并且 OP 发布的错误消息引用了一个非空值“Value:'client service stuff'”
    • 这不是@Dave 错误的原因。如果是,则错误消息中的“值”将为空字符串 ('')。这可能是由于源数据库区分大小写而 SSAS 数据库不区分大小写造成的。因此,源数据库中有两个不同的值只能在 SSAS 数据库中“变成”相同的值。 SSAS 正确地将其检测为错误。
    【解决方案2】:

    我今天遇到了类似的问题(同样的错误消息),为了让其他人遇到同样的问题,我在我的 wiki 上写了一些注释: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 值和属性名称的名称。我以前没见过这种情况,但由于某种原因,它发生在这里。我认为这个解决方案比设置多维数据集处理忽略重复键错误更好。

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

    【讨论】:

    • 感谢您的建议。从事这个项目已经有一段时间了,但下次我会试试你的技术。
    【解决方案3】:

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

    这是我的部分错误的模拟:

    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
    

    包括“区分大小写”。

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

    【讨论】:

    • 你最后一个空格字符对我来说是个问题。我不得不将一个管道连接到生成的“描述”文本,以查看添加了几个空格......更多的是设计不良的表格的结果。
    【解决方案4】:

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

    在“Cube”中右键=>“Process”=>“Change Settings”=>“Dimension Key Errors”

    激活的“用户自定义错误配置”

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

    键的问题将被忽略。

    【讨论】:

      【解决方案5】:

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

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

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

      在 VS 2010 Shell SSDT 中测试。

      【讨论】:

      • 这将导致显示该属性的重复项。例如,对于值为 1、2、3、4、5 但属性值为 Blue 和 Green 的维度键“Id”,该属性可能显示 Blue、Blue、Blue、Green、Green
      • 这消除了错误,但就像 Aaron 所说的那样导致重复。
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          谢谢大家

          内德

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              有时需要 keyColumns 中的复合键来解决重复的属性键

              【讨论】:

                【解决方案11】:

                我今天刚遇到这种情况,因为这里的解决方案都没有奏效,所以我摸不着头脑。终于解决了,我想我会添加我的解决方案,让其他任何人在谷歌上搜索这个错误并像我一样到达这里。

                在我的情况下,它不是 NULL 和空白字符串,因为我已经将 [NullProcessing] 值设置为“UnknownMember”。相反,它是 [Trimming] 值,在我的情况下,它设置为“Right”。

                虽然我知道我是如何解决的(?)但我不是 100% 知道为什么,但我假设当 SQL Server 这样做时它是 SELECT DISTINCT(col) FROM source 并且 [Trimming] 值设置为这样,分析服务器稍后会删除其他things 选项卡字符从末尾开始(例如,SQL Server 中的 RTRIM 没有)并以重复结束。

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

                【讨论】:

                • 2 年后仍然有用。
                • 修剪选项位于 DimensionAttribute -> (Source) KeyColumns -> (特定字段)。 wschampheleer.wordpress.com/2009/12/20/… 详细阐述了这一点以及可能出现的相关问题。
                【解决方案12】:

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

                【讨论】:

                  【解决方案13】:

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

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

                  我在多维数据集中使用了这个计算列,错误消失了。

                  【讨论】:

                  • 我对 CHAR(9) 标签提要也有同样的感受
                  • 一百万票,如果可以的话。非常感谢这对我来说完全是个问题。数据是用户可编辑的,因此换行符会潜入源数据中。
                  • 它可能是由换行符以外的字符引起的,因此例如在 ORACLE SQL 中,最好使用 REGEXP_REPLACE 只留下您知道有效的字符,例如REGEXP_REPLACE([AttributeColumn], '[^A-Za-z0-9 .()+-/:''&\@]','')
                  • 同样的问题,sql Server 2014。很奇怪的问题。
                  【解决方案14】:

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

                  【讨论】:

                    【解决方案15】:

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

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

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

                    【讨论】:

                      【解决方案16】:

                      如果它可以帮助像我这样的其他准新手,我将概述一个解决方案,我在尝试部署跨越多年的 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属性分别。这可能不是首选的解决方案,但它对我有用,我终于可以重新开始构建我的立方体了。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2017-10-20
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-01-17
                        • 1970-01-01
                        相关资源
                        最近更新 更多