parsowanie zapytania sql

0

Witam serdecznie.
Jaka jest najlepsza metoda wydobycia z zapytania SQL, nazw naglowkow kolum oraz ilosci kolumn.
Przykladowe zapytanie
select m1 as m1k, m2 as m2k from tab
Wynik operacji:
Nazwy kolumn:m1k,m2k
Ilosc kolumn:2

Miki

0

Masz ciąg znaków od SELECT do FROM i nim się zajmnujesz. Możesz przelecieć wyrażeniem regularnym i wyłapać czy jest AS i już :)

0

Witam,
myślę że mogło by to wyglądać jakoś tak

public static string[] GetColumnsName(String query)
        {
            List<String> resultList = new List<String>();
            String tmp = query.Split(new String[] { "from", "FROM" }, StringSplitOptions.RemoveEmptyEntries)[0];
            tmp = tmp.Split(new String[] { "select", "SELECT" }, StringSplitOptions.RemoveEmptyEntries)[0];
            String[] table = tmp.Split(new String[] { "," }, StringSplitOptions.RemoveEmptyEntries), array;
            foreach (String s in table)
            {
                array = s.Split(new String[] { "as", "AS" }, StringSplitOptions.RemoveEmptyEntries);
                if (array != null && (array.Length == 2 || array.Length == 1))
                    resultList.Add(array[array.Length - 1].Trim());
            }

            return resultList.ToArray();
        }

Zawsze można napisać to efektywniej ;)

            string[] columns = GetColumnsName(@"select m1 as m1k, m2 as m2k from tab");
            foreach (string s in columns)
                Console.WriteLine(s);
            Console.WriteLine(String.Format("Liczba kolumn: {0}", columns.Length));

Pozdrawiam

0

Siemka
Podoba mi sie rozwiazanie mykhaylo, dzieki, jak tylko bede mial pod reka kompilator to przetestuje.
Zainteresowala mnie tez odpowiedz SebaZ, mowisz cos o wyrazeniach regularnych, slyszalem ze to bardzo potezne narzedzie do przetwarzania tekstow, myslisz ze daloby sie wyciagnac potrzebne mi informacje wlasnie za pomoca "wyrazenia regularnego" ??

Miki

0

#ie wiem czy Ci pomoze, tutaj jest opisa#e zagad#ie#e wyraze# regularych w ko#tekscie c-scharp

(sorry za krzaczki ale klawiatura mi sie popsula # = litera po m )
http://morzel.net/edu/wdre/wdre_art.pdf

0

No jasne, że można.

Żeby zbędnie maszyny nie obciążać (ale co to za obciążenie :P) wyciągasz ciąg od SELECT do FROM, tak jak napisałem i dopiero to poddajesz działaniu RegEXP.

0

To moze byc wyrazenie w stylu:

select(?:\s+([\w][\d\w]*)\s+(?:as\s+([\w][\d\w]*))?\s+,)+from

Wynik jest w pierwszej badz drugiej grupie: pierwszej, jesli nie uzyto 'as', drugiej w przeciwnym przypadku.

Wiecej napisano na msdn ;)

0

A wg mnie łatwiej będzie WYKONAĆ:
SELECT * FROM (... twoj select) WHERE 0=1
(lub na MS SQL poprzedzić go SET FMTONLY ON)
Dlaczego:

  1. Czasem są kolumny, które nie mają nazwy np. SELECT Sum(*) FROM ...
  2. Pozapytania
  3. Unie
    etc, itp, itd...

pozdrawiaMM
EDIT: Zapomniałem dodać - trzeba później kolekcję Columns sprawdzić. :)

0

dzieki za odpowiedzi, juz widze, ze kilka fajnych rozwiazan sie pojawilo, jednak zeby zamknac ostatecznie temat, jedna kwestia.
Czy da sie za pomoca 1 wyrazenia regularnego, wyluskac nazwy wszystkich kolumn ?
Naturalnie zapytania sie beda zmieniac a co za tym idzie ilosc kolumn tez.. A niestety wyrazenie regularne musi pozostac takie samo ....

pozdrawiam
Miki

0

Generalnie tak.

Jezeli zapytanie bedzie w takim stylu jak podales to moje wyrazenie powinno podac Ci wszystkie kolumny (parami, tak jak opisalem). Jesli zas wystepuja bardziej skomplikowane zapytania, tak jak podal Marcin.Miga to wyrazenie bedzie duzo bardziej skomplikowane.

0

Mhmmm Johny_bravo w wyrazeniach regularnych dopiero raczkuje, a wiec wkleilem swoje zapytanie i Twoje wyrazenie do "Rad Software Regular Expression Designer" no i nic mi nie zwraca, probowalem cos modyfikowac ale dalej nic...
Miki

0
  1. Wyrazenie pisane z palca, ale powinno dzialac.
  2. Nie wiem czym jest "Rad Software Regular Expression Designer", ale skladnia .netowych wyrazen regularnych jest nieco inna niz np. posixowa (bardziej powszechna) stad moze nie dzialac w jakims testerze wyrazen.
  3. Wszystko o wyrazeniach masz opisane na msdn, wystarczy spedzic godzinke nad skladnia

Najlepiej machnij sobie krotki kod w c# z tym wyrazeniem i tam sprawdzaj.

0

witam ponownie, udalo mi sie uproscic wyrazenie ktore podal johny_bravo, i sprawic ze w stu procentach spelnia zalozenia, tzn wyciaga nazwy kolumn oraz ich ilosc.
Polecam tez zapoznanie sie ze strona
<url>
http://www.eti.pg.gda.pl/katedry/kask/pracownicy/Krystyna.Dziubich//_NET2007/lab2/Lab2_regex_StringBuilder.doc
</url>

Oto gotowe rozwiazanie w c#

 
            string text = "select count(*) as nazwa from invoices";
            string patern1 = "\\s+(?:as\\s+([\\w][\\d\\w]*))";
            Regex r = new Regex(patern1);
            MatchCollection mc = r.Matches(text);
            MessageBox.Show("znaleziono lańcuchów :" + mc.Count);
            for (int i = 0; i < mc.Count; i++)
            {
                MessageBox.Show("znaleziony lancuch: " + mc[i].Value + " na pozycji :" + mc[i].Index);
                MessageBox.Show("wartośc grupy test:" + mc[i].Groups[1].Value);
            } 

Jak widac dziala dobrze zarowno na typowych jaki i nietypowych zapytaniach...
Jeszcze raz dzieki za okazane zainteresowanie.
Mam nadzieje ze watek zacheci czesc programistow do uzywania wyrazen regularnych :)

Miki

0

Zwroc uwage, ze skladnia 'cos as nazwa' nie zawsze wystepuje. Czasem jest po prostu nazwa kolumny. No ale to zalezy jakie zapytania bedziesz mial.

1 użytkowników online, w tym zalogowanych: 0, gości: 1