Ошибка «Дублирующий ключ атрибута», когда атрибут не является ключом - PullRequest
43 голосов
/ 18 августа 2011

Я получаю следующую ошибку при обработке измерения:

Ошибки в механизме хранения OLAP: при обработке был обнаружен повторяющийся ключ атрибута: Таблица: 'dbo_Orders', Столбец: 'Проект', Значение:' служба поддержки клиентов '.Атрибутом является «Проект».

«Проект» - это атрибут измерения «Заказы», ​​но не ключ.Нигде я не указал, что столбец Project является ключевым!У меня должно быть столько дубликатов, сколько необходимо, точно так же, как поле имени.

Я новичок в проекте служб Analysis Services и действительно должен преодолеть тот факт, что SSAS постоянно жалуется на дублирующиеся значения, когдадолжно быть совершенно нормально иметь дублирующиеся значения.Я уверен, что это должно быть что-то простое, что я пропускаю.

Редактировать: Я понимаю, что можно установить KeyDuplicate = ReportAndContinue/ReportAndStop, а также можно установить KeyColumns и NameColumns.Но этот многоэтапный процесс кажется очень громоздким для того, что может показаться очень нормальной операцией, такой как добавление Address1, Address2, Address3, Firstname, Zipcode и других полей, которые обычно дублируются.Я не могу поверить, что этот громоздкий процесс нужно применять ко всем таким полям?

Заранее спасибо.

Ответы [ 16 ]

44 голосов
/ 01 сентября 2011

Обычно это результат наличия в исходной таблице / представлении пробелов и пустых значений.

По сути, SSAS делает это для каждого атрибута SELECT DISTINCT COALESCE (attr, '') FROM SOURCE

Службы анализа по умолчанию преобразуют значения NULL в пробелы, что приводит к появлению дубликатов пустых значений в результирующем фиде - отсюда и ошибка.

Я согласен, что это отстой и является серьезной проблемой для новых игроков.

Решение. Удалите все значения NULL из источника данных, например, повсеместно используя ISNULL / COALESCE, или отфильтровав строки, содержащие значение NULL, с помощью предложения where, или запустите оператор обновления, чтобы заменить все NULL значениями перед обработкой куба и т. Д.

14 голосов
/ 14 февраля 2013

Щелкните правой кнопкой мыши по атрибуту и ​​выберите «Свойства».Найдите «KeyColumn», который находится в категории «Источник» в окне «Свойства».Отредактируйте свойство «KeyColumn», оно отобразит удобное для пользователя окно.

Удалите атрибут с правой стороны (ключевые столбцы) окна и замените его фактическим столбцом идентификатора с левой стороны (доступные столбцы).

Затем отредактируйте свойство «NameColumn», появится то же самое окно.Переместите столбец атрибута (фактические данные, которые вы хотите отобразить) с левой стороны на правую.

Протестировано в VS 2010 Shell SSDT.

11 голосов
/ 23 июня 2016

У меня была та же проблема, и в атрибуте не было пустых значений или значений NULL.После некоторого анализа я обнаружил, что некоторые строки имеют символ конца строки.Таким образом, если 2 значения атрибута почти одинаковы, но одно из них имеет символ разрыва строки в конце, а другое нет, тогда SSAS вызывает ошибку «Duplicate attribute key».Это можно исправить, удалив символ переноса строки из атрибута.Я создал вычисляемый столбец со следующим определением:

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

Я использовал этот вычисленный столбец в кубе, и ошибка исчезла.

6 голосов
/ 29 января 2014

Только что это случилось со мной сегодня и на какое-то время почесал голову, поскольку ни одно из решений здесь не сработало. В конце концов решил и решил добавить свое решение для тех, кто погуглит эту ошибку и прибудет сюда, как и я.

В моем случае это были не NULL и пустые строки, так как у меня было значение [NullProcessing], уже установленное в «UnknownMember». Скорее, это было значение [Trimming], в моем случае оно было установлено на «Right».

Хотя я знаю, как я решил (?) Это, я не уверен на 100%, почему, но я предполагаю, что когда SQL Server делает это SELECT DISTINCT(col) FROM source и значение [Trimming] установлено как таковое, сервер анализа позже удаляет среди других символы конца вкладки с конца (чего, например, RTRIM в SQL Server нет) и заканчиваются дубликатами.

Таким образом, установка «Обрезка» на «Нет» может решить эту проблему, поскольку вкладки были данными, которые мне не нужны (мои данные анализируются / считываются / вводятся из внешних источников). Я просто заменил вкладки в столбце, и после этой обработки куб снова в порядке.

5 голосов
/ 02 июля 2012

Хотя мое другое решение на этой странице работает (и в зависимости от ситуации может быть более идеальным), это альтернативное решение:

Вот макет части моей ошибки:

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 голосов
/ 08 февраля 2013

У меня была та же проблема, и я нашел обходной путь для нее.

Щелкните правой кнопкой мыши "Cube" => "Процесс" => "Изменить настройки" => "Ошибки ключа измерения"

Активна «Конфигурация пользовательской ошибки пользователя»

Установите «Игнорировать ошибки» для этого четырех выпадающего списка «Ключ не найден» «Дублированный ключ» «Нулевой ключ преобразован в неизвестный» «Нулевой ключ не разрешен»

Проблема с ключами будет игнорироваться.

2 голосов
/ 03 апреля 2014

У меня возникла проблема после того, как я поиграл с добавлением идентификатора в ключевой столбец атрибута. С тех пор я удалил ключ, но обнаружил, что оператор select во время обработки все еще ссылается на идентификатор, что делает атрибут не уникальным. Я не мог найти способ решить это через свойства атрибута, поэтому я удалил все измерение и воссоздал его. Это решило проблему.

2 голосов
/ 02 июля 2012

У меня была похожая проблема сегодня (то же сообщение об ошибке), чтобы кто-то еще попал сюда с такой же проблемой, я добавил несколько заметок в мою вики: http://www.david -halliday.co.uk / wiki / doku.php ID = базы данных: оракул & # 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 для ключа атрибута и имя для имени атрибута. Я не видел этого раньше, но по какой-то причине это произошло здесь. Я полагаю, что это решение лучше, чем настройка куба на обработку, игнорирующую ошибки повторяющихся ключей.

Я предполагаю, что если кто-то строит измерение, соединяющее таблицы, это даст лучшую производительность / надежность. Но не цитируйте меня об этом.

1 голос
/ 16 июля 2018

Ничего из вышеперечисленного не решено для меня. То, что сработало, было чем-то похожим на то, что предложил Эрик У.

Мне пришлось настроить несколько ключевых столбцов для моих атрибутов. Например, для атрибута «Город» нужны ключевые столбцы «Страна», «Штат» и «Город».

Подробнее здесь: https://www.mssqltips.com/sqlservertip/3271/sql-server-analysis-server-ssas-keycolumn-vs-namecolumn-vs-valuecolumn/

0 голосов
/ 10 декабря 2018

В случае, если это поможет другим квази-новичкам, таким как я, я нарисую решение, которое я наконец-то нашел после борьбы с сообщением об ошибке «дублирующий ключ атрибута» при попытке развернуть измерение Date, охватывающее несколько лет.Например, в сообщении об ошибке указано, что у меня в атрибуте CalendarQuarter есть дубликаты ключей атрибутов.Это сначала смутило меня, потому что каждый полный год состоит из четырех кварталов (то есть 1, 2, 3 и 4), поэтому, конечно, у меня были дубликаты.В конце концов меня осенило, что в этом проблема - иными словами (и вопреки названию этой темы) атрибут БЫЛ ключом.Я решил эту проблему, добавив столбец вычисления CalendarQuarterKey с именем в таблицу Date моего DSV, чтобы получить уникальные ключи для моего атрибута CalendarQuarter, например, «20171» вместо просто «1» для 2017 Q1, «20172» вместо просто «2» для2017 Q2, и т. Д. То же самое с моим атрибутом CalendarMonth: у каждого полного года есть двенадцать месяцев (то есть 1, 2, 3 ..., 11, 12), поэтому, конечно, у меня также были дубликаты.То же решение: я добавил именованный столбец расчета CalendarMonthKey в таблицу дат моего DSV, чтобы получить уникальные ключи для атрибута CalendarMonth, например, «201701» вместо просто «1» для января 2017 года, «201702» вместо просто «2» дляФевраль 2017 года и т. Д. Затем я использовал мои новые столбцы «CalendarQuarterKey» и «CalendarMonthKey» в качестве KeyColumn для моих атрибутов CalendarQuarter и CalendarMonth соответственно.Возможно, это не самое предпочтительное решение, но оно сработало для меня, и я наконец могу вернуться к построению своего куба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...