Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отформатировать SQL текст / 9 сообщений из 9, страница 1 из 1
28.01.2019, 17:59
    #39766093
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отформатировать SQL текст
Может знает кто компонент, способный отформатировать текст SQL ?
Что бы на вход можно было подать SQL текст, а на выходе - отформатированный SQL текст.

Вот как здесь, только для Delphi.
http://www.dpriver.com/pp/sqlformat.htm

Нашёл только
General SQL Parser v2.9.0 VCL version
Но там муть какая та и денег хотят.
...
Рейтинг: 0 / 0
28.01.2019, 18:02
    #39766099
asviridenkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отформатировать SQL текст
Valery_B,

Без денег - нет.
...
Рейтинг: 0 / 0
28.01.2019, 18:46
    #39766124
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отформатировать SQL текст
Valery_B,


погуглил по [sql beautifier delphi] и вот что нашлось:
https://github.com/SqlToys/SqlFormatter
...
Рейтинг: 0 / 0
28.01.2019, 19:32
    #39766135
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отформатировать SQL текст
Valery_B,

Отформатированный можно будет потом задорого отдельно продавать?
...
Рейтинг: 0 / 0
28.01.2019, 19:35
    #39766138
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отформатировать SQL текст
Кроик Семёнпогуглил по [sql beautifier delphi] и вот что нашлось:
https://github.com/SqlToys/SqlFormatter
Ага... а ещё и попробовал.
Не компилируется.
...
Рейтинг: 0 / 0
28.01.2019, 19:36
    #39766139
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отформатировать SQL текст
Vlad FValery_B,
Отформатированный можно будет потом задорого отдельно продавать?

Мне даже спасибо не скажут.
...
Рейтинг: 0 / 0
28.01.2019, 19:53
    #39766143
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отформатировать SQL текст
На тебе кусочек говнокода.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
Function PrepareSQLScript(s: string): string;
var
  n,i,k  : integer;
  l      : array of string;
  p,p0,j : integer;
  isText : boolean;
  IsWork : boolean;
  c      : Char;
  Lev    : array of integer;
  ln     : integer;
  isCode : boolean;
  List   : TStringList;
begin
  for k:=0 to 1 do begin
    s:=Trim(s);
    isCode:=pos('#13#10+',s)>0;
    if (s[1]='''') and (s[length(s)]='''') then begin
      s:=copy(s,2,length(s)-2);
      isCode:=True;
      s:=StringReplace(s,'''''','''',[rfReplaceAll]);
    end;


    s:=StringReplace(s,'" +'#13#10,#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'"+'#13#10,#13#10,[rfReplaceAll]);
    s:=StringReplace(s,#13#10'"',#13#10,[rfReplaceAll]);

    s:=StringReplace(s,#13#10'"','#13#10',[rfReplaceAll]);
    s:=StringReplace(s,'#13#10+','#13#10',[rfReplaceAll]);
    s:=StringReplace(s,'''#$D#$A''',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'''#$D#$A''',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'''#13#10''',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'''#13#10',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'''#$D#$A',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'#$D#$A''',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'''#13#10',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'#13#10''',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,#13#10'''',#13#10,[rfReplaceAll]);

    s:=StringReplace(s,'''#$A',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'''#$A''',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,'#$A''',#13#10,[rfReplaceAll]);

    s:=StringReplace(s,'=''''''''','=''''',[rfReplaceAll]);
    s:=StringReplace(s,'>''''''''','>''''',[rfReplaceAll]);
    s:=StringReplace(s,'<''''''''','<''''',[rfReplaceAll]);

    // Удаление лишних значков '
    List:=TStringList.Create;
    try
      List.Text:=s;
      for i:=0 to List.Count-1 do begin
        s:=List[i];
        p:=0;
        if Length(s)>5 then begin
          repeat
            isWork:=False;
            isText:=False;
            for j:=1 to length(s)-1 do begin
              if isText then begin
                if (Copy(s,j,2)='''''') then begin
                  if ((j=length(s)-1) or ((j+3<=length(s)) and (s[j+3]<>''''))) and (s[j-1]<>'''') then begin
                    isWork:=True;
                    s:=Copy(s,1,p-1)+Copy(s,p+1,j-p)+Copy(s,j+2,length(s));
                    Break;
                  end;
                end;
              end else begin
                if (Copy(s,j,2)='''''') then begin
                  if ((j=1) or (s[j-1]<>'''')) and ((j<length(s)-1) and (s[j+2]<>'''')) then begin
                    p:=j;
                    isText:=True;
                  end;
                end;
              end;
            end;
          until not IsWork;
          List[i]:=s;
        end;
      end;
      s:=List.Text;
    finally;
      List.Free
    end;



    s:=trim(s);
    n:=length(s);
    if n=0 then Exit;

    if (s[n]='''') and (s[1]='''') then begin
      s:=copy(s,2,n-2);
    end;

    s:=StringReplace(s,' RIGHT OUTER JOIN',#13#10+'RIGHT OUTER JOIN',
      [rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' LEFT OUTER JOIN',#13#10+'LEFT OUTER JOIN',
      [rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' INNER JOIN',#13#10+'INNER JOIN',[rfIgnoreCase,
      rfReplaceAll]);

    s:=StringReplace(s,' WHERE',#13#10+'WHERE',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' GROUP BY',#13#10+'GROUP BY',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' ORDER BY',#13#10+'ORDER BY',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' FROM',#13#10+'FROM',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' UNION',#13#10+'UNION',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' SELECT',#13#10+'SELECT',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' UPDATE',#13#10+'UPDATE',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' DELETE',#13#10+'DELETE',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,#13#10#13#10,#13#10,[rfReplaceAll]);
    s:=StringReplace(s,#13#10+' ',#13#10,[rfReplaceAll]);
    s:=StringReplace(s,' AND'#13#10,#13#10'AND ',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' OR'#13#10,#13#10'OR ',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' AND ',#13#10'AND ',[rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,' OR ',#13#10'OR ',[rfIgnoreCase,rfReplaceAll]);

    // Constructions

    s:=StringReplace(s,'SELECT * '#13#10'FROM','SELECT * FROM',
      [rfIgnoreCase,rfReplaceAll]);
    s:=StringReplace(s,'('#13#10'SELECT','(SELECT',[rfIgnoreCase,rfReplaceAll]);

    // check out for contingecy;
    n:=length(s);
    if n<2 then
      Exit;
    if copy(s,1,2)=#13#10 then begin
      s:=copy(s,3,n-2);
    end;

    s:=s+' ';

    // Alignment
    p:=1;
    n:=-1;
    while p<length(s) do begin
      p0:=PosEx(#13#10,s,p);
      if p0=0 then begin
        p0:=length(s);
      end;
      inc(n);
      SetLength(l,n+1);
      l[n]:=copy(s,p,p0-p);
      p:=p0+2;
    end;

    isText:=False;
    SetLength(Lev,1);
    Lev[0]:=0;
    ln:=0;
    s:='';
    for i:=0 to length(l)-1 do begin
      l[i]:=trim(l[i]);
      if length(l[i])>1 then begin
        if (l[i][1]='''')and(l[i][length(l[i])-1]='+') then begin
          l[i]:=copy(l[i],2,length(l[i])-2);
        end;
      end;
    end;

    for i:=0 to length(l)-1 do begin
      for p:=1 to length(l[i]) do begin
        c:=l[i][p];
        if (c='''')or(c='"') then begin
          isText:=not isText;
        end;
        if not isText then begin
          l[i][p]:=AnsiUpperCase(l[i][p])[1];
          if c='(' then begin
            inc(ln);
            SetLength(Lev,ln+1);
            Lev[ln]:=p;
          end;
          if c=')' then begin
            if ln>0 then
              Dec(ln);
          end;
        end;
      end;
      if (ln>=0)and(i<length(l)-1) then l[i+1]:=StringOfChar(' ',Lev[ln])+l[i+1];
      if trim(l[i])<>'' then s:=s+l[i]+#13#10;
    end;

    if isCode then begin
      s:=trim(s);
      if copy(s,length(s)-1,2)=''';' then begin
        SetLength(s,length(s)-2);
      end;
      if copy(s,length(s)-1,2)=''';' then begin
        SetLength(s,length(s)-2);
      end;
    end;
  end;
  Result:=s;
end;

...
Рейтинг: 0 / 0
28.01.2019, 20:27
    #39766157
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отформатировать SQL текст
Valery_BVlad FValery_B,
Отформатированный можно будет потом задорого отдельно продавать?
Мне даже спасибо не скажут.
Ну а и смысл тогда?

- Доктор, а я жить буду?
- А смысл??
...
Рейтинг: 0 / 0
28.01.2019, 23:00
    #39766222
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отформатировать SQL текст
Valery_B,


вопрос о форматировании в непонятном виде звучит странно
на 84-й страничке лексер

вывод с него форматируй как хочешь
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Отформатировать SQL текст / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]