Параметризованный PowerQuery для Excel с обработкой нуля - PullRequest
0 голосов
/ 09 ноября 2018

Я сталкиваюсь с ошибкой при попытке выполнить параметризованный SQL-запрос из Excel, используя значения параметров ( StartDate и EndDate ), хранящиеся в листе. Когда параметр EndDate оставлен пустым на листе, я хотел бы использовать текущую дату и время в качестве значения по умолчанию. Вместо этого я получаю странное сообщение об ошибке, несмотря на то, что запрос, сгенерированный Excel, кажется действительным. Я создал базовый пример, чтобы продемонстрировать эту проблему, и обнаружил, что это повторяемая проблема.

Шаги для воспроизведения:

  1. Создать новый лист Excel
  2. Создать новую таблицу с именем Параметры со следующими значениями:

Parameter table

  1. Создание нового запроса SQL (Данные -> Получить данные -> Из базы данных -> Из базы данных SQL Server)

  2. Введите базовый запрос, подобный следующему (примечание: для сервера и базы данных я использовал хорошо зарекомендовавшую себя базу данных SQL Server 2014, которую я использовал для многих других аналогичных запросов - я уверен, что это не источник проблем) при нажатии ОК:

Query1

  1. Нажмите кнопку Изменить на следующем экране. Перейдите в расширенный редактор и введите следующий запрос, который должен заменить пустой параметр EndDate текущим местным временем:

    let
        Params = Excel.CurrentWorkbook(){[Name="Params"]}[Content]{0},
        StartDate = Params[#"StartDate"],
        EndDate = if Params[#"EndDate"] is null then DateTime.LocalNow() else Params[#"EndDate"],
        Source = Sql.Database("N0049MF1", "Allmine", 
            [Query="SELECT '" 
                & DateTime.ToText(StartDate) & "' AS StartDate, '" 
                & DateTime.ToText(EndDate) & "' AS EndDate"])
    in
        Source
    
  2. Нажмите Готово, чтобы вернуться в редактор запросов. Появится следующий баннер:

Permission Banner

  1. При нажатии кнопки «Изменить разрешения» открывается диалоговое окно с просьбой установить уровень конфиденциальности - я использовал «Организационный».

  2. При нажатии кнопки «Сохранить» открывается следующее диалоговое окно. Вы можете видеть, что параметры были правильно добавлены в запрос. Нажмите Run, чтобы продолжить:

enter image description here

  1. На данный момент запрос работал правильно и дал следующие результаты:

Good Results

  1. Затем я попытался удалить дату в ячейке EndDate таблицы Params и обновить запрос. На этот раз, когда появилось диалоговое окно разрешений Native Database Query, для EndDate были правильно установлены текущие дата и время, что указывает на правильную работу M-кода:

Native Query With NULL EndDate

  1. После нажатия кнопки «Выполнить» диалоговое окно исчезает, но сразу же появляется снова, без сообщения об ошибке. Нажатие на кнопку «Выполнить» несколько раз закрывает и диалоговое окно, при этом оно каждый раз быстро появляется.

  2. При нажатии на кнопку «Отмена» отображается следующая ошибка:

[Ошибка разрешения] Ошибка EvaluateNativeQueryUnpermitted: запрос «SELECT» 01.01.2017, 12:00:00 «AS StartDate», «11/8/2018 17:07:56 PM« AS EndDate »не утвержден для исполнения.

Выводы

Похоже, что запрос действителен, а права доступа установлены правильно. Изменение EndDate обратно на допустимую дату заставляет запрос возобновить работу должным образом, но удаление даты вызывает его повторный сбой. Используя профилировщик SQL Server, я вижу, что запрос успешно выполняется, когда присутствуют оба параметра StartDate и EndDate , но никогда даже не отправляется в базу данных, если EndDate параметр пуст.

Это действительно проблема с разрешением? Проблема с кодом М? Ошибка в Excel?

1 Ответ

0 голосов
/ 09 ноября 2018

Я не могу воспроизвести проблему (запрос работает для меня), но я почти уверен, что это действительно проблема с разрешениями.

Посмотрите, исправляет ли это отключение выравнивания приватности.

Options and Settings

Privacy Levels

...