Почему я получаю Microsoft SQL: ошибка неправильного синтаксиса в Power BI?

#sql-server #powerbi #common-table-expression #powerbi-desktop #powerbi-datasource

#sql-server #powerbi #common-table-expression #powerbi-desktop #powerbi-источник данных

Вопрос:

Я пытаюсь получить некоторые данные с помощью CTE, но выдает ошибку, что я должен использовать точки с запятой. Я думаю, что я исправил это, поместив; перед WITH , но теперь я получаю Microsoft SQL: Incorrect syntax near ';'. Incorrect syntax near ')'.

Может кто-нибудь, пожалуйста, сказать мне, что не так? Раньше это было очень просто, просто скопируйте запрос из MS SQL в Power BI. Мой запрос отлично работает в MS SQL.

 ;WITH unit AS (
   SELECT
         tm.create_date 
       , tm.timeslip_date
       , cases.case_sk
       , cases.case_number
       , cases.closed_ind
       , cases.atty2_sk
       , vc.atty2_name    AS [Business Leader]
       , em.smtp_reply_to AS [Business Leader Email]
       , cases.atty1_sk
       , vc.atty1_name    AS [Assign Attorney]
       , tm.detail_notes
   FROM dbo.cases
   LEFT JOIN dbo.vcases vc ON cases.case_sk = vc.case_sk
   LEFT JOIN dbo.employee em ON cases.atty2_sk = em.employee_sk    
   LEFT JOIN dbo.timeslips tm ON cases.case_sk = tm.case_sk
   WHERE cases.closed_ind = 'O'
   AND NOT EXISTS(SELECT * FROM dbo.timeslips tsm WHERE tsm.case_sk = cases.case_sk AND tsm.timeslip_date > DATEADD(day, -90, GETDATE()) )
), agg AS (
   SELECT
         MIN(u.create_date)   AS [Created Date]
       , MAX(u.timeslip_date) AS [Last Bill Date]
       , u.case_sk
       , u.case_number
       , u.closed_ind
       , u.atty2_sk
       , u.[Business Leader]
       , u.[Business Leader Email]
       , u.atty1_sk
       , u.[Assign Attorney]
   FROM unit u
   GROUP BY 
         u.case_sk
       , u.case_number
       , u.closed_ind
       , u.atty2_sk
       , u.[Business Leader]
       , u.[Business Leader Email]
       , u.atty1_sk
       , u.[Assign Attorney]
)
SELECT agg.*, unit.detail_notes
FROM agg
INNER JOIN unit
   ON  agg.[Last Bill Date] = unit.[timeslip_date]
        AND agg.case_sk = unit.case_sk
        AND agg.case_number = unit.case_number
        AND agg.closed_ind = unit.closed_ind
        AND agg.atty2_sk = unit.atty2_sk
        AND agg.atty1_sk = unit.atty1_sk
  

Спасибо

Комментарии:

1. Это Import или DirectQuery? Можете ли вы поделиться текстом PowerQuery (расширенный редактор)?

2. @SMor, я никогда не использовал терминаторы, но когда я удалил его, я получу отсутствующий терминатор в Power BI.

3. @DavidBrowne-Microsoft, это прямой запрос.

Ответ №1:

Когда вы используете пользовательский запрос в качестве источника DirectQuery, вы должны предоставить запрос, который PowerBI может создавать дополнительные критерии и объединения во время выполнения.

Если вы создаете источник DirectQuery с таким запросом

 with q as (select * from sys.objects) select * from q
  

PowerBI будет составлять запросы типа

 select * from (
    with q as (select * from sys.objects) select * from q
) SourceQuery where 1 = 2
  

Ошибка, которую вы получаете, не имеет ничего общего с тем, есть ли у вас оператор terminator или нет. ; не допускается в середине запроса, но with нет . CTE великолепны, но у них есть недостаток: они не являются «составными».

Вы можете обойти это, установив запрос как представление в SQL Server или преобразовав подзапросы CTE во вложенные подзапросы, но этот запрос действительно слишком сложен для использования в модели DirectQuery. Итак, вам действительно нужно загрузить результаты в таблицу, чтобы использовать DirectQuery, или переключиться на импорт и выполнить запрос только при обновлении.

Комментарии:

1. Применимо ли это также, если запрос находится в хранимой процедуре?

2. ДА. Таким образом, вы обычно не можете использовать хранимые процедуры в DirectQuery.