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.

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