Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Interloper
Member

Откуда: Москва
Сообщений: 520
Использую компонент TSQLQuery. Необходимо выводить в лог текст запроса. Если выводить просто свойство SQL.Text, то в нем будут встречаться имена параметров (:ParamName, :ParamName2 и т.д.), но не их значения. Как получить текст запроса с уже подставленными параметрами?
17 июн 14, 08:12    [16173159]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26132
Interloper, параметры на то и параметры, что они отправляются не в виде текста.
17 июн 14, 09:08    [16173368]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Kotъ-Begemotъ
Member

Откуда: Где-то рядом...
Сообщений: 4007
Interloper
Использую компонент TSQLQuery. Необходимо выводить в лог текст запроса. Если выводить просто свойство SQL.Text, то в нем будут встречаться имена параметров (:ParamName, :ParamName2 и т.д.), но не их значения. Как получить текст запроса с уже подставленными параметрами?


До вызова Query.Execute (или Open) написать вывод своего запроса в виде сообщения, с подстановкой нужных параметров:

ShowMessage(Format('SELECT .... FROM SOMETABLE ST WHERE ST.SFIELD1=%s AND ST.SFIELD2=%d ... ', [Par1Value, Par2Value]));
17 июн 14, 09:48    [16173588]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
MaratIsk
Member

Откуда: Astana, Kazakhstan
Сообщений: 2476
Interloper
Использую компонент TSQLQuery. Необходимо выводить в лог текст запроса. Если выводить просто свойство SQL.Text, то в нем будут встречаться имена параметров (:ParamName, :ParamName2 и т.д.), но не их значения. Как получить текст запроса с уже подставленными параметрами?


а что показать, если параметр типа БЛОБ ? может лучше подумать прежде чем спросить?
17 июн 14, 09:49    [16173590]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Interloper
Member

Откуда: Москва
Сообщений: 520
MaratIsk,
Я знаю, что спрашиваю. У меня нет параметров BLOB. Да и если бы были, их тоже можно представить в текстовом виде, если что.
17 июн 14, 09:56    [16173645]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26132
Interloper
Я знаю, что спрашиваю.

Протестую.
17 июн 14, 09:58    [16173659]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
MaratIsk
Member

Откуда: Astana, Kazakhstan
Сообщений: 2476
Interloper
MaratIsk,
Я знаю, что спрашиваю. У меня нет параметров BLOB. Да и если бы были, их тоже можно представить в текстовом виде, если что.


да???????????????????????????????
17 июн 14, 09:59    [16173664]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
MaratIsk
Member

Откуда: Astana, Kazakhstan
Сообщений: 2476
Interloper,

судя по всему ты смутно представляешь как обрабатываются параметры запроса
17 июн 14, 10:01    [16173682]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4529
Interloper
Использую компонент TSQLQuery. Необходимо выводить в лог текст запроса. Если выводить просто свойство SQL.Text, то в нем будут встречаться имена параметров (:ParamName, :ParamName2 и т.д.), но не их значения. Как получить текст запроса с уже подставленными параметрами?
Изменить вызов. Например сделав его 'exec sp_executesql' для mssql
17 июн 14, 10:09    [16173738]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
MaratIsk
а что показать, если параметр типа БЛОБ ? может лучше подумать прежде чем спросить?
Например, показать первые 16 байт в Hex виде
17 июн 14, 12:04    [16174711]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Interloper
Member

Откуда: Москва
Сообщений: 520
wadman
Interloper
Я знаю, что спрашиваю.

Протестую.

Какой умный совет. Вы прямо очень помогли, спасибо.
17 июн 14, 12:14    [16174824]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26132
Interloper
wadman
пропущено...

Протестую.

Какой умный совет. Вы прямо очень помогли, спасибо.

Еще раз:
wadman
параметры на то и параметры, что они отправляются не в виде текста.

Их значения даже на стороне сервера в дампе запроса не увидеть (с наскоку).
17 июн 14, 12:18    [16174858]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Interloper
Member

Откуда: Москва
Сообщений: 520
MaratIsk,
Я отлично понимаю, как обрабатываются запросы с параметрами, как формируется и хранится структура XSQLDA.
А ты что, решил выпендриться, показать какой ты дохрена умный, чтобы свысока указывать мне, что я чего-то не знаю, а ты знаешь? В этом смысл твоего поста.
17 июн 14, 12:25    [16174927]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
MaratIsk
Member

Откуда: Astana, Kazakhstan
Сообщений: 2476
Interloper
MaratIsk,
Я отлично понимаю, как обрабатываются запросы с параметрами, как формируется и хранится структура XSQLDA.
А ты что, решил выпендриться, показать какой ты дохрена умный, чтобы свысока указывать мне, что я чего-то не знаю, а ты знаешь? В этом смысл твоего поста.


я помогаю тебе понять абсурдность
Interloper
Как получить текст запроса с уже подставленными параметрами
17 июн 14, 14:50    [16176197]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
MaratIsk
Member

Откуда: Astana, Kazakhstan
Сообщений: 2476
Interloper,

ты серьезно думаешь, что клиентская библиотека субд склеивает текст запроса из значений параметров?
17 июн 14, 15:02    [16176304]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Interloper
Member

Откуда: Москва
Сообщений: 520
MaratIsk,
Нет, не думаю.
17 июн 14, 16:57    [16177301]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Interloper
Member

Откуда: Москва
Сообщений: 520
MaratIsk,

Абсурдности здесь нет. Я подразумевал, что может быть существует некая отладочная функция, которая позволяет получить текст запроса со значениями вместо плейсхолдеров. Если не существует - так и ответьте. Демагогию разводить не следует.
17 июн 14, 16:59    [16177312]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62926
Interloper,
параметры не подсталяются, они передаются отдельно от запроса
17 июн 14, 20:51    [16178252]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48611

Interloper
Я подразумевал, что может быть существует некая отладочная функция,
которая позволяет получить текст запроса со значениями вместо плейсхолдеров. Если не
существует - так и ответьте.

Отвечаю: не существует. Обломись.

Posted via ActualForum NNTP Server 1.5

17 июн 14, 21:13    [16178308]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
goldmi45
Member

Откуда:
Сообщений: 1193
Dimitry Sibiryakov
Interloper
Я подразумевал, что может быть существует некая отладочная функция,
которая позволяет получить текст запроса со значениями вместо плейсхолдеров. Если не
существует - так и ответьте.

Отвечаю: не существует. Обломись.

Но можно наваять самому.
18 июн 14, 07:06    [16179544]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
PPA
Member

Откуда: Караганда -> Липецк
Сообщений: 811
goldmi45
Но можно наваять самому.

+1.
У себя давно написали велосипед он может не всегда сработать и чуток испортить SQL :)
но в 99% случаях упрощает отладку - т.к. достаточно скопировать запрос в PL/SQL Developer и он выполнится
алгоритм очень тупой - ищем :ParamName и заменяем на /*:ParamName*/ 123

К сообщению приложен файл. Размер - 30Kb
18 июн 14, 08:45    [16179691]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26132
PPA
но в 99% случаях упрощает отладку - т.к. достаточно скопировать запрос в PL/SQL Developer и он выполнится

Вообще-то у оракла есть и свои средства, которые ничего не портят.
18 июн 14, 09:07    [16179766]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
ma1tus
Member

Откуда:
Сообщений: 689
Interloper,

разве проблема?

with AQuery do 
begin

  LogSQL := SQL.Text;

  for i := 0 to High(Param) do
    LogSQL := YourLikeReplaceStringFunction(LogSQL, VarToStr(Param[i]){что заменить}, VarToStr(Values[i]){чем заменить});

end;
20 июн 14, 11:42    [16194164]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Alexander Rogan
Member

Откуда:
Сообщений: 2
Вот она та самая, что возможно поможет.

function SQLParamsToSQL(Q:TQuery):string;
var LogSQL, nam,val:string;
   i:integer;
   function ch_point(v:string):string;
   begin
     if pos(',',v)>0 then v[pos(',',v)]:='.';
     result:=v;
   end;

   function ch_date(v:string):string;
   begin
     if v='0:00:00' then result:='null'
     else result:=''''+v+'''';
   end;

begin

     with Q do
     begin
     LogSQL:=SQL.Text;
          for i := 0 to ParamCount-1 do
          begin
          nam:=':'+VarToStr(Params[i].name);
          val:=VarToStr(Params[i].Value);

          if val='' then val:='null' else
          case Params[I].DataType of
            ftString: val:=''''+val+'''';
            ftInteger: val:=val;
            ftFloat:  val:=ch_point(val);
            ftCurrency: val:=ch_point(val);
            ftDate: val:=ch_date(val);
            ftTime: val:=ch_date(val);
            ftDateTime:val:=ch_date(val);
            else
            val:=val;
          end;

          LogSQL := stringreplace(LogSQL, nam, val,[rfIgnoreCase]);
          end;
     end;
     result:=LogSQL;
end;
9 авг 19, 01:26    [21945248]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
DimaBr
Member

Откуда:
Сообщений: 11324
"Она та самая" такое осилит ?
select ':param1' as AAA from Table where Id = :param1
9 авг 19, 01:36    [21945250]     Ответить | Цитировать Сообщить модератору
 Re: Как получить текст запроса TSQLQuery с учетом подставленных параметров  [new]
Alexander Rogan
Member

Откуда:
Сообщений: 2
DimaBr,

Так а зачем извращаться?
Мне она очень помогла INSERT/UPDATE/DELETE
и она заменяет 1 параметр по имени если их 2 одинаковых то 2-й пролетает
и нельзя делать по другому, так как параметры могут быть :Param1 :Param11
она возьмет только первый, а второй дождется имени :Param11
Вообщем с обычными запросами прокатывает.
9 авг 19, 02:34    [21945251]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить