Лучший отвечающий
Не работает запрос в BIDS, но нормально обрабатывается в SSMS

Вопрос
-
Столкнулся с такой проблемой. Написал запрос, в SSMS проверил - данные выводятся верно. Скопировал его в представление в BIDS - а там ошибку выводит на первую строчку запроса:
IF OBJECT_ID ('tempdb..#Цена') IS NOT NULL DROP TABLE #Цена
Почему может возникнуть такая проблема? Формат именованного запроса не допускает выполнение сценариев? Как-нибудь можно это исправить?
12 июля 2011 г. 8:45
Ответы
-
Spektr_07, что за проект Вы разрабатываете в BIDS? Скорее SSAS, если используете именованные запросы... но в любом случае, ошибка именно из-за них. Именованный запрос - это выражение SQL, представляющее таблицу, и никаких сценариев в нем быть не должно. Только выборка строк и столбцов из одного или нескольких источников данных.
Defining Named Queries in a Data Source View (Analysis Services)
Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.- Предложено в качестве ответа Dmitry Davydov 19 июля 2011 г. 9:04
- Помечено в качестве ответа Vinokurov YuriyModerator 21 июля 2011 г. 9:09
14 июля 2011 г. 8:06 -
Если я правильно разобрал приведенный скрипт, то Вы получаете в нем хронологию изменения цены номенклатуры в виде
Номенклатура Дата_нач Дата_кон Цена Ту же задачу можно решить, воспользовавшись вот таким чистым SQL-ным запросом
SELECT Нач.Номенклатура, Нач.Дата AS Дата_нач, ISNULL(Конч.Дата, GETDATE()) AS Дата_кон, Нач.Цена FROM Цена Нач LEFT OUTER JOIN Цена Конч ON Нач.Номенклатура = Конч.Номенклатура AND Конч.Дата = (SELECT MIN(Дата) FROM Цена WHERE Номенклатура = Конч.Номенклатура AND Дата > Нач.Дата)
Трудно сказать что-либо относительно его тяжеловесности, не видя Вашу систему, не зная ничего об индексах и объемах данных, так что вполне возможно, что запрос этот повиснет у Вас надолго. Но на небольших выборках он задачу решает. А объединение с календарем к нему Вы можете добавлять аналогично.
Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.- Предложено в качестве ответа Dmitry Davydov 19 июля 2011 г. 9:05
- Помечено в качестве ответа Vinokurov YuriyModerator 21 июля 2011 г. 9:09
15 июля 2011 г. 14:09
Все ответы
-
Spektr_07, что за проект Вы разрабатываете в BIDS? Скорее SSAS, если используете именованные запросы... но в любом случае, ошибка именно из-за них. Именованный запрос - это выражение SQL, представляющее таблицу, и никаких сценариев в нем быть не должно. Только выборка строк и столбцов из одного или нескольких источников данных.
Defining Named Queries in a Data Source View (Analysis Services)
Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.- Предложено в качестве ответа Dmitry Davydov 19 июля 2011 г. 9:04
- Помечено в качестве ответа Vinokurov YuriyModerator 21 июля 2011 г. 9:09
14 июля 2011 г. 8:06 -
Да, вы правы - проект Analysis Services. Дело в том, что другого решения я не нашел, кроме как использовать сценарий, но не подумал, что может не прокатить в Analysis Services.
У меня есть таблица с ценами номенклатуры с полями Дата, Номенклатура, Цена. Например, пришел товар на склад 10 числа - ему поставили определенную цену. До 20 числа ничего не менялось, поэтому с 11 по 19 записей по этой номенклатуре нет. 20 числа могли изменить цену - запись на эту дату появилась. Мне нужно вывести данные на каждый день по каждой номенклатуре.
Сначала я использовал запрос:
IF OBJECT_ID('tempdb..#Цена') IS NOT NULL DROP TABLE #Цена
IF OBJECT_ID('tempdb..#k1') IS NOT NULL DROP TABLE #k1--- Делаем уникальность записей по Дата и Номенклатура
SELECT Дата, Номенклатура, Цена
INTO #Цена
FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY Номенклатура, Дата ORDER BY Номенклатура, Дата) AS rn
FROM Цена) t
WHERE rn=1
ORDER BY Номенклатура, ДатаALTER TABLE #Цена ADD k1 INT IDENTITY
SELECT c1.Номенклатура, c1.Дата, c1.Цена, MIN(c2.k1) AS n
INTO #k1
FROM #Цена c1 LEFT JOIN #Цена c2 ON (c1.Номенклатура=c2.Номенклатура AND c1.k1<c2.k1)
GROUP BY c1.Номенклатура, c1.Дата, c1.Цена, c1.k1
SELECT k1.Номенклатура, k1.Дата AS Дата_нач, ISNULL(c.Дата, CAST(CONVERT(CHAR(8), GETDATE(), 112) AS DATETIME)) AS Дата_кон, k1.Цена
FROM #k1 k1 LEFT JOIN #Цена c ON (k1.n=c.k1)Для вывода начальной и конечной даты для каждой номенклатуры. Потом через JOIN соединил результат этого запроса с таблицей календаря - и получил цены номенклатуры на каждый день. В Management Studio у меня все получилось, нужные данные вывелись. Но когда попытался забросить этот запрос в куб, вылезла ошибка.
Может кто-нибудь подскажет, как можно решить мою задачу по другому?
14 июля 2011 г. 12:47 -
Если я правильно разобрал приведенный скрипт, то Вы получаете в нем хронологию изменения цены номенклатуры в виде
Номенклатура Дата_нач Дата_кон Цена Ту же задачу можно решить, воспользовавшись вот таким чистым SQL-ным запросом
SELECT Нач.Номенклатура, Нач.Дата AS Дата_нач, ISNULL(Конч.Дата, GETDATE()) AS Дата_кон, Нач.Цена FROM Цена Нач LEFT OUTER JOIN Цена Конч ON Нач.Номенклатура = Конч.Номенклатура AND Конч.Дата = (SELECT MIN(Дата) FROM Цена WHERE Номенклатура = Конч.Номенклатура AND Дата > Нач.Дата)
Трудно сказать что-либо относительно его тяжеловесности, не видя Вашу систему, не зная ничего об индексах и объемах данных, так что вполне возможно, что запрос этот повиснет у Вас надолго. Но на небольших выборках он задачу решает. А объединение с календарем к нему Вы можете добавлять аналогично.
Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.- Предложено в качестве ответа Dmitry Davydov 19 июля 2011 г. 9:05
- Помечено в качестве ответа Vinokurov YuriyModerator 21 июля 2011 г. 9:09
15 июля 2011 г. 14:09 -
Большое спасибо, все работает. Не получилось только связать с таблицей календаря - может подскажите, в чем я ошибся? Календарь на 2011 год брал из той же таблицы с ценами таким запросом (Kalendar):
SELECT DISTINCT Period
FROM ЦеныНоменклатуры
WHERE YEAR(Period) = 2011
Там получались все даты, которые мне были нужны. Соединял его с моим запросом через FULL OUTER JOIN:
(
MONTH(N_Dates.Дата_нач) = MONTH(Kalendar._Period) AND DAY(N_Dates.Дата_нач) = DAY(Kalendar._Period))(
MONTH(N_Dates.Дата_кон) = MONTH(Kalendar._Period) AND DAY(N_Dates.Дата_кон) = DAY(Kalendar._Period))(
MONTH(N_Dates.Дата_нач) < MONTH(Kalendar._Period) AND MONTH(N_Dates.Дата_кон) > MONTH(Kalendar._Period))(
MONTH(N_Dates.Дата_нач) = MONTH(Kalendar._Period) AND DAY(N_Dates.Дата_нач) < DAY(Kalendar._Period))(
MONTH(N_Dates.Дата_кон) = MONTH(Kalendar._Period) AND DAY(N_Dates.Дата_кон) > DAY(Kalendar._Period))where
N_Dates.Цена <> 0Но в итоге бывает, к примеру, такая вещь:
Дата начала - 04.05.2011
Дата окончания - 11.05.2011
А мне выводит дату 23.05.2011
Никак не пойму, отчего такое может быть...
22 июля 2011 г. 14:56 -
Последний вопрос снимается, разобрался.
25 июля 2011 г. 23:29