Преобразовывая в int16, int32, int64 - как Вы знаете который выбрать?

1113 Я исследовал причину такого поведения и, думаю, выяснил причину. Приведенное ниже объяснение основано на книге «пошаговые инструкции SQL SERVER 2008 MDX», стр. 51–58 (особенно об избежании конфликтов ссылок)

Ваша проблема - типичная проблема эталонного конфликта. В MDX иерархия не может использоваться более одного раза в данном кортеже, но если вы используете иерархию USER и лежащую в ее основе иерархию атрибутов, вы по существу обходите стороной этот чек. Это то, что произошло в вашем запросе

В первом запросе вы используете Иерархию пользователей

[Дата]. [Календарь]. [Месяц]. & Amp; [2013] & amp; ; 1

blockquote>

В MDX иерархия пользователей переводится в иерархии атрибутов. В вашем первом запросе

SELECT NON EMPTY {[Показатели]. [Сумма интернет-продаж]} ON 0, NON EMPTY {[Дата]. [Календарь]. [Месяц]. & Amp; [2013] & amp; 1 } ON 1 FROM [Приключенческие работы] ГДЕ
{[Дата]. [Дата]. & [20130105]: [Дата]. [Дата]. & amp; [ 20130106]}

blockquote>

вы используете Иерархию пользователей "[Дата]. [Календарь]. [Месяц]. & [2013] & amp; 1 ", что в последний уровень имеет «[Дата]. [Дата]». Затем в предложении where для фильтрации используется та же иерархия атрибутов «[Date]. [Date]». Поскольку в иерархии USER вы не использовали конечный уровень, следовательно, вы указали частичный адрес, поэтому члены и его предки разрешены. Все потомки игнорируются в переводе. Посмотрите на приведенный ниже запрос (это основано на вашем первом запросе, я намеренно удалил предложение where).

with member [Measures].[CalendarYear] as [Date].[Calendar Year].currentmember.name
member [Measures].[CalendarSemester] as  [Date].[Calendar Semester of Year].currentmember.name
member [Measures].[CalendarQuater] as  [Date].[Calendar Quarter of Year].currentmember.name
member [Measures].[CalendarMonth] as  [Date].[Month of Year].currentmember.name
member [Measures].[CalendarDate] as [Date].[Date].currentmember.name
SELECT 
NON EMPTY { [Measures].[Internet Sales Amount] ,[Measures].[CalendarYear],[Measures].[CalendarSemester],[Measures].[CalendarQuater],[Measures].[CalendarMonth],[Measures].[CalendarDate]} ON 0,
NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM    [Adventure Works] 

Результат. enter image description here

Обратите внимание, что календарный год, семестр и квартал показывают значения не по умолчанию. Но мы никогда не использовали их. Это показывает, что перевод пользовательской иерархии выполняется в базовые иерархии атрибутов. Теперь посмотрите на Календарь, он все еще показывает «Весь период». Так как это было проигнорировано. Теперь, если вы добавите предложение where обратно, в Date по-прежнему будет отображаться «All Period», есть две причины: 1) потому что это было проигнорировано при переводе иерархии пользователей, 2) вы использовали диапазон в where. Если вы замените свой кортеж оси строк на ваш кортеж where, он все равно будет показывать «All Period» в качестве диапазона. Однако для решения этой проблемы потребуется всего две даты.

Исходя из этого, при решении вашего запроса у него было два перевода для иерархии атрибутов Date, один сказал игнорировать его на основе иерархии пользователей, другой предоставил диапазон. Вот где из-за конфликта результат неверен.

Теперь давайте рассмотрим запрос, который вы задали мне в своем комментарии ранее

with member [Measures].[CalendarYear] as [Date].[Calendar Year].currentmember.name
member [Measures].[CalendarSemester] as  [Date].[Calendar Semester of Year].currentmember.name
member [Measures].[CalendarQuater] as  [Date].[Calendar Quarter of Year].currentmember.name
member [Measures].[CalendarMonth] as  [Date].[Month of Year].currentmember.name
member [Measures].[CalendarDate] as [Date].[Date].currentmember.name
SELECT 
NON EMPTY { [Measures].[Internet Sales Amount] ,[Measures].[CalendarYear],[Measures].[CalendarSemester],[Measures].[CalendarQuater],[Measures].[CalendarMonth],[Measures].[CalendarDate]} ON 0,
NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM    [Adventure Works]
WHERE   {[Date].[Date].&[20130105]}

Результат: enter image description here

Обратите внимание, что это время разрешения одного члена, было использовано вместо разрешения иерархии пользователей. Теперь это поведение может быть связано с тем, что один перевод дает «Весь период», а другой дает член, следовательно, член выиграл.

Чтобы еще раз подтвердить это, я внес изменения в мой образец AdventureWorks. Иерархия атрибутов Date основана на столбце «Простая дата». Я выставил «Простую дату» как отдельный атрибут и обработал свой куб.

Посмотрите на запрос «Простая дата» и его результаты.

with member [Measures].[CalendarYear] as [Date].[Calendar Year].currentmember.name
member [Measures].[CalendarSemester] as  [Date].[Calendar Semester of Year].currentmember.name
member [Measures].[CalendarQuater] as  [Date].[Calendar Quarter of Year].currentmember.name
member [Measures].[CalendarMonth] as  [Date].[Month of Year].currentmember.name
member [Measures].[CalendarDate] as [Date].[Date].currentmember.name
SELECT 
NON EMPTY { [Measures].[Internet Sales Amount] ,[Measures].[CalendarYear],[Measures].[CalendarSemester],[Measures].[CalendarQuater],[Measures].[CalendarMonth],[Measures].[CalendarDate]} ON 0,
NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM    [Adventure Works]
WHERE   
--{[Date].[Date].&[20130105]}
{[Date].[Simple Date].&[20130105]:[Date].[Simple Date].&[20130106]}

Результаты: enter image description here

8
задан Vidar 6 November 2008 в 21:02
поделиться

6 ответов

Все здесь, кто упомянул, что объявление Int16 сохраняет поршень, должны получить downvote.

Ответ на Ваш вопрос должен использовать ключевое слово "интервал" (или если Вы чувствуете себя подобно ему, используйте "Int32").

Это дает Вам диапазон до 2,4 миллиардов чисел... Кроме того, процессоры на 32 бита обработают те ints лучше... также (и САМАЯ ВАЖНАЯ ПРИЧИНА) то, что, если Вы планируете использование того интервала почти по какой-либо причине..., это должен будет, вероятно, быть "интервал" (Int32).

В платформе .NET 99,999% числовых полей (которые являются целыми числами) является "ints" (Int32).

Пример: Массив. Длина, Процесс. Идентификатор, Windows. Ширина, Кнопка. Высота, и т.д., и т.д., и т.д. 1 миллион раз.

Править: Я понимаю, что моя раздражительность собирается вниз проголосовать за меня..., но это - правильный ответ.

20
ответ дан 5 December 2019 в 05:13
поделиться

Вопреки текущему самому популярному ответу более короткие целые числа (как Int16 и SByte) часто делают, времена занимают меньше места в памяти, чем большие целые числа (как Int32 и Int64). Можно легко проверить это путем инстанцирования больших массивов sbyte/short/int/long и использования perfmon для измерения размеров управляемой "кучи". Это верно, что много разновидностей CLR расширят эти целые числа для определенной для ЦП оптимизации при выполнении арифметики на них и таком, но при хранении как часть объекта они поднимают только столько памяти, сколько необходимо.

Так, определенно необходимо принять размер во внимание особенно, если Вы будете работать с большим списком целых чисел (или с большим списком объектов, содержащих целочисленные поля). Необходимо также рассмотреть вещи как совместимость с CLS (который запрещает любые целые числа без знака в общедоступных участниках).

Для простых случаев как преобразование строки к целому числу я соглашаюсь, что Int32 (интервал C#) обычно имеет большую часть смысла и вероятен, что будут ожидать другие программисты.

1
ответ дан 5 December 2019 в 05:13
поделиться

Если мы будем просто говорить, то приблизительно пара чисел, выбирая самое большое не будет иметь заметного значения в Вашем полном использовании оперативной памяти и будет просто работать. Если Вы будете говорить о большом количестве чисел, то необходимо будет использовать TryParse () на них и выяснить самый маленький международный тип, для сохранения поршня.

0
ответ дан 5 December 2019 в 05:13
поделиться

Неоднократно попытка TryParse () не имеет смысла, Вам объявили поле уже. Вы не можете передумать, если Вы не делаете то поле текстового объекта. Не хорошая идея.

Независимо от того, что данные, которые представляет поле, имеют физическое значение. Это - возраст, размер, количество, и т.д. Физические количества имеют реалистические ограничения на своем диапазоне. Выберите международный тип, который может сохранить тот диапазон. Не пытайтесь зафиксировать переполнение, это была бы ошибка.

3
ответ дан 5 December 2019 в 05:13
поделиться

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

Если Вы действительно не имеете никакого верхнего предела и хотите позволить 'неограниченные' значения, попытайтесь добавить библиотеки.Net Java runtime к своему проекту, который позволит Вам использовать java.math. Класс BigInteger - который делает математику на почти неограниченном целом числе размера.

Примечание: Библиотеки.Net Java идут с полным DevStudio, но я не думаю, что они идут с Экспрессом.

0
ответ дан 5 December 2019 в 05:13
поделиться

Просто требуемый для добавления этого... Я помнил, что в эпоху.NET 1.1 компилятор был оптимизирован так, чтобы 'международные' операции были на самом деле быстрее, чем байт или короткие операции.

Я полагаю, что это все еще содержит сегодня, но я запускаю некоторые тесты теперь.


Править: У меня есть неожиданное исследование: добавление, вычтите и умножьтесь, операции для короткого (s) на самом деле возвращают интервал!

9
ответ дан 5 December 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: