Я сталкиваюсь с ошибкой при попытке выполнить параметризованный SQL-запрос из Excel, используя значения параметров ( StartDate и EndDate ), хранящиеся в листе. Когда параметр EndDate оставлен пустым на листе, я хотел бы использовать текущую дату и время в качестве значения по умолчанию. Вместо этого я получаю странное сообщение об ошибке, несмотря на то, что запрос, сгенерированный Excel, кажется действительным. Я создал базовый пример, чтобы продемонстрировать эту проблему, и обнаружил, что это повторяемая проблема.
Шаги для воспроизведения:
- Создать новый лист Excel
- Создать новую таблицу с именем Параметры со следующими значениями:
Создание нового запроса SQL (Данные -> Получить данные -> Из базы данных -> Из базы данных SQL Server)
Введите базовый запрос, подобный следующему (примечание: для сервера и базы данных я использовал хорошо зарекомендовавшую себя базу данных SQL Server 2014, которую я использовал для многих других аналогичных запросов - я уверен, что это не источник проблем) при нажатии ОК:
Нажмите кнопку Изменить на следующем экране. Перейдите в расширенный редактор и введите следующий запрос, который должен заменить пустой параметр 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
Нажмите Готово, чтобы вернуться в редактор запросов. Появится следующий баннер:
При нажатии кнопки «Изменить разрешения» открывается диалоговое окно с просьбой установить уровень конфиденциальности - я использовал «Организационный».
При нажатии кнопки «Сохранить» открывается следующее диалоговое окно. Вы можете видеть, что параметры были правильно добавлены в запрос. Нажмите Run, чтобы продолжить:
- На данный момент запрос работал правильно и дал следующие результаты:
- Затем я попытался удалить дату в ячейке EndDate таблицы Params и обновить запрос. На этот раз, когда появилось диалоговое окно разрешений Native Database Query, для EndDate были правильно установлены текущие дата и время, что указывает на правильную работу M-кода:
После нажатия кнопки «Выполнить» диалоговое окно исчезает, но сразу же появляется снова, без сообщения об ошибке. Нажатие на кнопку «Выполнить» несколько раз закрывает и диалоговое окно, при этом оно каждый раз быстро появляется.
При нажатии на кнопку «Отмена» отображается следующая ошибка:
[Ошибка разрешения] Ошибка 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?