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
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
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ż :)
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
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
#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
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.
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 ;)
A wg mnie łatwiej będzie WYKONAĆ:
SELECT * FROM (... twoj select) WHERE 0=1
(lub na MS SQL poprzedzić go SET FMTONLY ON)
Dlaczego:
pozdrawiaMM
EDIT: Zapomniałem dodać - trzeba później kolekcję Columns sprawdzić. :)
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
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.
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
Najlepiej machnij sobie krotki kod w c# z tym wyrazeniem i tam sprawdzaj.
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
Zwroc uwage, ze skladnia 'cos as nazwa' nie zawsze wystepuje. Czasem jest po prostu nazwa kolumny. No ale to zalezy jakie zapytania bedziesz mial.