Pchełki SQL: małe – duże

https://xpil.eu/9nh

Praca programisty jest - przynajmniej w teorii - fajna, prosta i przyjemna. Dostajemy projekt, dostajemy dokumentację, z której jednoznacznie wynika co mamy na wejściu i co chcemy dostać na wyjściu, siadamy, piszemy kod, testujemy kod, prosimy kilku użytkowników, żeby przetestowali wyniki i jak wszyscy są zadowoleni, wrzucamy kod do ogólnego użytku, wystawiamy fakturę i voila, gotowe.

A zaraz potem przybiega pierdzący tęczą jednorożec w towarzystwie reniferów, Świętego Mikołaja i uczciwego polityka...

Albowiem nigdy nie zdarza się, żeby było tak, jak opisałem powyżej. Może z wyjątkiem reniferów. Te można spotkać od czasu do czasu.

W rzeczywistości najczęściej jest tak, że jesteśmy wrzucani w środek (lub nawet końcówkę) jakiegoś projektu, który już jest opóźniony i który przekroczył budżet pięciokrotnie; użytkownicy drą włosy z głów bo nie mają swoich danych, menadżerowie biznesowi biegają we wszystkie strony niczym smerfy na widok Gargamela i ciskają gromy w mniej lub bardziej przypadkowych kierunkach, główny menadżer projektu balansuje między łagodną psychozą a kurvicum totallitarre, a przerośnięty team programistów tonie w tonach niejasnej dokumentacji w języku koreańskim, stercie wzajemnie sprzecznych specyfikacji biznesowych, w międzyczasie prowadząc regularne wojny z teamem testerów i audytorów. Łatwiej byłoby zakończyć projekt za pomocą stada pijanych krokodyli.

Jednak realia są jakie są i trzeba sobie radzić. A więc stawiać sobie małe, osiągalne cele i je realizować. Krok po kroku. Nie próbować naprawić świata, tylko spłuczkę w kiblu.

Dzisiejszą spłuczką w kiblu będą nazwy tabel w bazie danych. Pokażę za pomocą maleńkiej Pchełki SQL, jak pozmieniać nazwy wszystkich tabel na zapisane wyłącznie małymi literami.

Dlaczego akurat małymi?

Wygodniej się używa nazw pisanych małymi literami, bo zajmują mniej miejsca wizualnie (w UI SSMS), bo nie wymagają używania klawisza Shift, w końcu bo autor niniejszego blogu tak lubi, a że to jest mój blog, to tak właśnie zrobimy, a jak się komuś nie podoba, niech sobie idzie oglądać śmieszne koty.

Chyba nie mógłbym być specjalistą od reklamy. W każdym razie nie na tyle długo, żeby dotrwać do pierwszej wypłaty...

Uwaga: powyższe działanie ma sens wyłącznie w sytuacji, kiedy nie używamy notacji węgierskiej. Jeżeli tabela nazywa się "ListaUzytkownikow", wolimy zostawić taką nazwę. Ale jeżeli tabela nazywa się "LISTA_UZYTKOWNIKOW", chcemy zmienić ją na "lista_uzytkownikow". Kod, który zaraz pokażę nie sprawdza tego tylko "na głupiego" zamienia wszystkie nazwy na pisane małą literą.

Najpierw musimy znaleźć wszystkie tabele, których nazwy zawierają przynajmniej jedną wielką literę:

DECLARE @sqls TABLE ( s NVARCHAR(MAX) )

INSERT  @sqls
        SELECT  'EXECUTE sys.sp_rename N''' + s.name + '.' + t.name + ''', N''' + LOWER(t.name) + ''', ''OBJECT''; '
        FROM    sys.tables t
        JOIN    sys.schemas s
                ON t.schema_id = s.schema_id
        WHERE   s.name + '.' + t.name <> s.name + '.' + LOWER(t.name) COLLATE Latin1_General_CS_AS

Małe wyjaśnienie: kruczek siedzi w ostatniej linii kodu:

... WHERE {warunek} COLLATE {sposób porównywania}

"_CS_" oznacza tu "Case Sensitive", czyli "uwzględniaj wielkości liter". Jeżeli wynik porównania nazwy tabeli z jej wersją "małoliterową" jest negatywny (różnią się), to znaczy, że nazwa tabeli zawiera co najmniej jedną wielką literę, czyli chcemy ją zmienić.

Po wykonaniu powyższego kodu mamy zmienną tabelaryczną @sqls wypełnioną poleceniami SQL zmieniającymi nazwy tabel. Teraz tylko trzeba je wykonać:

DECLARE @sql NVARCHAR(MAX);

WHILE EXISTS ( SELECT 1 FROM     @sqls )
    BEGIN
        SELECT TOP 1
                @sql = s
        FROM    @sqls;
        EXECUTE(@sql);
        DELETE  FROM @sqls
        WHERE   s = @sql;
    END

Po naszemu: weź z tabeli @sqls pierwszy z brzegu rekord, zapisz go do zmiennej @sql i wykonaj, następnie skasuj ten rekord z @sqls; powtarzaj dopóki w @sqls są jakieś rekordy.

W wyniku wszystkie tabele, których nazwy zawierały wielkie litery, zostaną przemianowane na wersję wyłącznie z małymi literami. Na szczęście sam język SQL jest "nieczuły" na wielkość liter w nazwach obiektów, więc wszystkie zapytania będą działać bez zmian.

https://xpil.eu/9nh

3 komentarze

  1. 1. Tu aż prosi się [nie chodzi o świnie] kursor
    2. przed uruchomieniem skryptu należy sprawdzić [min 2 razy], czy cała baza nie jest case sensitive. Bo wtedy wszystkie skrypty … będą wymagać przeglądu.

    1. 1. Kursorom mówię zdecydowane „raczej nie”.

      2. Słusznie. Stosowną korektę wprowadzę lada {tu wpisać jakiś interwał}

  2. Pewnie mój komentarz jest anachroniczny , ale 25 lat temu, na bazie danych ORACLE , robiliśmy to tak:
    for table in (select table_name from user_tables)
    update table set name = to_lower(name) where name !=to_lower(name);
    Być może zrobiłem drobne błedy syntaktyczne… to było 25 lat temu.

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.