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

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

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

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


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

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

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

Код: 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
Отформатировать SQL текст
    #39766157
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BVlad FValery_B,
Отформатированный можно будет потом задорого отдельно продавать?
Мне даже спасибо не скажут.
Ну а и смысл тогда?

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


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

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


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