Страницы: 1
RSS
Передача параметров в в sql-запрос через NativeQuery
 
Новая тема: Передача параметров в в sql-запрос через NativeQuery

Форумчане, подскажите пжлста, не первый раз сталкиваюсь с таким при использовании Power Query, но проблему решить никак не удается.

В экселе использую функцию NativeQuery, чтобы передать параметру sql-запросу. Вот как это выглядит:

Редактор Power Query:
Код
let
Source = Teradata.Database("tdsb14"),
Query= Value.NativeQuery(
Source, "SELECT * FROM Home
WHERE date BETWEEN @date1 AND @date2",
[date1 = dt1, date2 = dt2])
in
Query

--------------------------------------------------------
dt1 и dt2 -- параметры отдельно в эксель задал
--------------------------------------------------------

Ну и вот: получаю ошибку 3939 существует несоответствие между количеством заданных параметров и количеством требуемых параметров

Гуглил такую ошибку, но там ответы индивидуально рассматриваются, к моей проблеме не применишь.

Если есть у кого-нибудь мысли, поделитесь пожалуйста, на стороне бд терадаты возникает несоответствие? Потому что если подтягиваю данные их MS SQL все работает.

Буду рад любой помощи. Спасибо!
 
Цитата
Дмитрий Осипов написал:
Передача параметров
Откуда и куда? Предложите новое название темы - модераторы поменяют. И кол следует оформлять соответствующим тегом? ищите такую кнопку (см. скрин) и исправьте своё сообщение.
 
Дмитрий, вот нашёл просто пример из Интернета запроса, может вам тоже надо что-то типа Localhost указывать ?
Надо же как-то указать, где находится ваша база "tdsb14" (сам точно не знаю, просто предположил)

Код
let
    Source = Sql.Database("localhost", "Adventure Works DW"),
    Test = Value.NativeQuery(
            Source, 
            "SELECT * FROM DimDate 
            WHERE EnglishMonthName=@MonthName 
            AND
            EnglishDayNameOfWeek=@DayName", 
            [MonthName="March", DayName="Tuesday"])
in
    Test

Тут ещё нашёл, что некоторые ставят #  перед названиями параметров. Попробуйте написать

Код
[date1 = #dt1, date2 = #dt2])

Вот тут написано (в комментариях) https://blog.crossjoin.co.uk/2016/12/11/passing-parameters-to-sql-queries-with-value-nativequery-in-...
Изменено: New - 03.08.2020 09:58:08
 
Цитата
Дмитрий Осипов написал:
dt1 и dt2 -- параметры отдельно в эксель задал
Вы о чем? Именованный диапазон так не назвать. Или еще запросы есть?
Остальное не знаю
Код
dt1 = Text.From(Excel.CurrentWorkbook(){[Name="dt_1"]}[Content][Column1]{0}),
dt2 = Text.From(Excel.CurrentWorkbook(){[Name="dt_2"]}[Content][Column1]{0})
 
 
Цитата
Михаил Л написал:
Вы о чем? Именованный диапазон так не назвать. Или еще запросы есть?
да, dt1 и dt2 задал отдельными запросами вот так:
 
Изменено: Дмитрий Осипов - 03.08.2020 12:42:32
 
Дмитрий Осипов, глупый вопрос: а вы передаете параметры именно в процедуру БД?
F1 творит чудеса
 
Цитата
Максим Зеленский написал:
а вы передаете параметры именно в процедуру БД?
Нет, Максим, это просто параметризированный запрос :)
 
Цитата
Максим Зеленский написал:
глупый вопрос: а вы передаете параметры именно в процедуру БД?
Ну именно в этот запрос селекта: "SELECT * FROM Home WHERE date BETWEEN @date1 AND @date2"
 
Самое интересное, то, что при передачи параметров таким же способом в MS SQL Server, все работает и данные подтягиваются...
Этим способом пробовал [date1 = #dt1, date2 = #dt2] --- не помогло
 
Дмитрий Осипов, а так?
Код
  let Source = Sql.Database("azuredb.powerqueryworkshop.com", "Adventureworks2012")
  in Value.NativeQuery(Source, "SELECT * FROM HumanResources.EmployeeDepartmentHistory
  WHERE StartDate>=@MonthName and StartDate<=@DayName", 
  [MonthName=Date.From("01/01/2004"), DayName=Date.From("01/01/2005")])
 
ммм.... а собрать запрос целиком в строке не срабатывает? типа
Код
SELECT * FROM HomeWHERE date BETWEEN " & Date.ToText(dt1, format) & " AND " & Date.ToText(dt2, format)

второй вариант - сами параметры PQ преобразовать в нужный строковый формат перед отправкой в Value.NativeQuery
там надо только понять, как выглядит формат даты в этой самой Teradata.

Ну и не факт, что Value.NativeQuery понимает эту самую Teradata, и наоборот. Может, у них принципиальная идеологическая несовместимость (хотя нет, почитал - вроде дружат).

Но я надеюсь, вы отправляете не именно этот запрос к БД? потому что параметризировать такой простецкий запрос вообще не зачем через Value.NativeQuery. С такой проблемой справится обычный Query Folding при фильтрации через интерфейс
Изменено: Максим Зеленский - 04.08.2020 01:09:39
F1 творит чудеса
 
Цитата
Максим Зеленский написал:
вообще не зачем через Value.NativeQuery.
Максим, а чем такой вариант хуже чем через фильтрацию в интерфейсе? И сопутствующий
Цитата
Максим Зеленский написал:
С такой проблемой справится обычный Query Folding
Query Folding уже 100% работает со всеми Odbc.Source, OleDb.Source?
 
Цитата
Андрей VG написал:
Query Folding уже 100% работает со всеми Odbc.Source, OleDb.Source?
про 100% не знаю :) С Teradata должен работать.
Цитата
Андрей VG написал:
Максим, а чем такой вариант хуже чем через фильтрацию в интерфейсе?
после этого шага фолдинг останавливается, в основном с этой точки зрения. И с этой же точки зрения это удобно, ибо значения параметров автоматически преобразуются в скаляры и будут встроены в запрос, созданный в процессе фолдинга.

Я понимаю, что бывают запросы, которые оптимальнее написать самому и которые PQ по разным причинам написать не умеет (например, некоторые функции преобразования дат пришлось переписывать в запрос, так как PQ не смог в фолдинг сыграть). Но если есть возможность простые запросы вместо секса с правильным подбором аргументов отдать фолдингу - я за это.

PS хотя принципиально разобраться, что ему не хватает тут - конечно интересно.
F1 творит чудеса
 
Цитата
Максим Зеленский написал:
преобразуются в скаляры и будут встроены в запрос
Максим, спасибо. Понял. Это я со своей колокольни смотрю. :)  Если есть возможность выполнять SQL запросы (а в Power Query можно ваять код вполне себе хранимой процедуры, это не MS Query где только стиль представлений проходит), то я предпочту его написать, а в получатель отправлять уже его результат, ну, максимум добавить Join с другим источником. Ибо, зачем козе баян надеяться на то, что ещё один оптимизатор чего-нибудь допишет в запрос, после чего это может начать, мягко говоря, подтормаживать.
Страницы: 1
Наверх