none
Не работает запрос в BIDS, но нормально обрабатывается в SSMS RRS feed

  • Вопрос

  • Столкнулся с такой проблемой. Написал запрос, в 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))

     

    OR

    (

    MONTH(N_Dates.Дата_кон) = MONTH(Kalendar._Period) AND DAY(N_Dates.Дата_кон) = DAY(Kalendar._Period))

     

    OR

    (

    MONTH(N_Dates.Дата_нач) < MONTH(Kalendar._Period) AND MONTH(N_Dates.Дата_кон) > MONTH(Kalendar._Period))

     

    OR

    (

    MONTH(N_Dates.Дата_нач) = MONTH(Kalendar._Period) AND DAY(N_Dates.Дата_нач) < DAY(Kalendar._Period))

     

    OR

    (

    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