Как вытащить значения столбцов таблицы Excel в предложение SQL WHERE с помощью Power Query M? - PullRequest
0 голосов
/ 13 января 2020

У меня есть таблица Excel, в которой конечный пользователь вводит ссылочные номера в столбец «RefNum». Я также создал столбец «RefNum_ SQL» с формулой, которая автоматически форматирует список с запятыми и круглыми скобками для предложения WHERE, в случае, если это упрощает части SQL / M. Мы будем называть эту таблицу таблицей «Ввод»:

RefNum  RefNum_Formatted
2123    (2123,
2456    2456,
2789    2789)

Затем у меня будет запрос SQL, который извлекает дополнительные детали, привязанные к этому ссылочному номеру, и загружает их в таблицу другого лист рабочей книги Excel.

SELECT RefNum, LocationID, ShipDate
FROM database.dbo.Products (NOLOCK)
WHERE RefNum IN (2123, 2456, 2789)

Результаты запроса затем загружаются в таблицу на другом листе рабочей книги, которую мы будем называть таблицей «Вывод»:

RefNum  LocationID  ShipDate
2123    13321       12/3/2019
2456    16654       5/17/2019
2789    19987       8/24/2019

Может код Power Query M перетащить значения в столбце RefNum непосредственно в предложение WHERE запроса SQL, чтобы конечному пользователю не пришлось вручную настраивать запросы в расширенном Редактор по мере изменения списка?


Вот код, который я попытался на основе ресурсов, которые я нашел до сих пор:

let
  Source = Sql.Database("server", "database")
  RefNum_Formatted = table.Column(Input, RefNum_Formatted)
  Output = Value.NativeQuery( Source,
    "SELECT RefNum, LocationID, ShipDate
     FROM database.dbo.Products (NOLOCK)
     WHERE RefNum = @RefNum_Formatted")
in
  Output

При попытке запустить вышеупомянутый M код, я получаю следующую ошибку:

DataSource.Error: Microsoft SQL: необходимо объявить скалярную переменную "@RefNum_Formatted".

Я понимаю, что как в настоящее время написано Power Query ожидает, что @RefNum_Formatted будет объявленной переменной в SQL, а не в таблице Excel; однако я не могу понять, как создать соединение со значениями таблицы «Вход», которые можно вставить в запрос, используя M. Можно ли это сделать?


Подобные вопросы задаются в ссылках ниже но я не смог успешно применить ни один из ответов:

Мощный запрос для фильтрации SQL представления на основе списка столбцов Excel

Использование столбцов Excel в SQL Запрос предложения Where

https://techcommunity.microsoft.com/t5/excel/create-dynamic-power-query-sql-by-using-excel-table-column/m-p/211504

1 Ответ

1 голос
/ 13 января 2020

здесь есть несколько неправильных вещей

  1. "@ RefNum_Formatted" просто означает, что строка, не являющаяся ссылкой на предыдущий шаг
  2. Шаг RefNum_Formatted, скорее всего, список, а не строка

попробуйте этот код (может потребоваться настроить ссылки на таблицы / столбцы)

let
  Source = Sql.Database("server", "database"),
  RefNum_Formatted = List.Accumulate(Input[RefNum_Formatted],"",(state, current) => state & current),  //List.Accumulate converts list to string
  SQL_Code = "SELECT RefNum, LocationID, ShipDate
     FROM database.dbo.Products (NOLOCK)
     WHERE RefNum IN " & RefNum_Formatted,  //that's how you pass a reference to a step, it cannot be done inside a string
  Output = Value.NativeQuery( Source, SQL_Code)
in
  Output

РЕДАКТИРОВАТЬ: добавлен шаг источника

...