#sql-server #ssas #cube
#sql-сервер #ssas #куб
Вопрос:
Когда я пытался установить связь между двумя объектами через представление источника данных, появилось это сообщение об ошибке:-
Базовая таблица базы данных содержит столбцы разного типа данных (предположим, один из них — int, а другой — smallint
or bigint
). каков способ решения этой проблемы?
Ответ №1:
Исходный столбец и столбец назначения имеют разные типы данных
Я не вижу, что неясно в этом сообщении. Если у вас есть первичный ключ, все внешние ключи, которые относятся к этому первичному ключу, должны иметь один и тот же тип данных.
Если учесть требования к диапазону и хранилищу типов данных:
Data type Range Storage
bigint -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 8 Bytes
int -2,147,483,648 to 2,147,483,647 4 Bytes
smallint -32,768 to 32,767 2 Bytes
tinyint 0 to 255 1 Byte
Вы можете видеть, что диапазон значений, которые может содержать столбец, значительно различается между типами данных. Для поддержания взаимосвязи между первичным и внешним ключами тип должен быть одинаковым, чтобы диапазон значений, которые он может содержать, совпадал.
Если бы у вас был int
первичный ключ, но smallint
внешний ключ, тогда было бы невозможно, чтобы столбец внешнего ключа содержал значение, большее 32 767, где, поскольку первичный ключ мог бы содержать гораздо большее значение.
Итак, способ решить эту проблему — обновить тип данных столбца, который вы хотите использовать в качестве внешнего ключа, чтобы он соответствовал первичному ключу, прежде чем создавать связь.
Ответ №2:
Для меня это проблема с таблицей фактов. У нас есть именованный запрос к таблице фактов, который ссылается на представление в DWH. Хорошо! Я жестко запрограммировал этот столбец (столбец ключа измерения) как -1 в представлении и добавил в именованный запрос в кубе. При этом тип данных был выбран как System.int32 вместо System.Десятичный и, следовательно, я столкнулся с этой проблемой.
Я изменил представление (удалил жестко закодированное значение и извлек непосредственно из таблицы), удалил столбец из именованного запроса и добавил его снова. Это устраняет проблему.