GPS GPS
754
BLOG

Po co piszę bloga?

GPS GPS Rozmaitości Obserwuj notkę 2
Ja piszę bloga po to, by czytały to potem moje prawnuki. Czyli by nie tylko wiedziały jak pradziadek się nazywał, kiedy się urodził, kiedy umarł i co napisał w życiorysie składanym w jakimś urzędzie, ale by wiedziały co myślał i kim był naprawdę. W większości to, co pozostaje po przodkach, są to jakieś dokumenty urzędowe, a my, Polacy, najczęściej w urzędach kłamiemy, więc te dokumenty nie oddają rzeczywistości.
Drugim powodem pisania przeze mnie bloga jest to, by się w dyskusjach nie powtarzać. Ja lubię polemizować i często używam tych samych argumentów - lepiej jest gdy jakąś kwestię precyzyjniej wyjaśnię i uzasadnię w bardziej szczegółowej notce na blogu, a potem, gdy będzie taka konieczność w dyskusjach i polemikach, będę podawać odnośnik do tej notki.
Ja jestem polemistą, szukam sporów, mam temperament erystyczny, głównie dyskusja powoduje to, że chce mi się coś zrozumieć, napisać lub wyjaśnić. Dyskusje, kontrowersje, polemiki, spory, prowokacje, kłótnie, kontakt z innymi ludźmi, rozmowy - to wszystko powoduje, że chce mi się myśleć.
Janusz Korwin-Mikke zauważył kiedyś, że ludzie jak ich spytać kim są, to najczęściej wymieniają swój zawód - mówią: jestem lekarzem, piwowarem, informatykiem, dziennikarzem, muzykiem itd… - a to jest trochę głupie, bo najczęściej ten zawód wykonują po to by zarobić i wydać pieniądze na to, co najbardziej lubią, a przecież to co najbardziej lubią decyduje o tym kim są, a nie to w jaki sposób na to zarabiają. Ci ludzie najczęściej są filatelistami, podróżnikami, odkrywcami, kolekcjonerami sztuki, artystami, majsterkowiczami, piwoszami itd…
Dlatego ja napisałem w nagłówku swojego bloga kim jestem i zrobiłem w związku z tym kilka notek z tym związanych. A jestem:
To szóste to mój zawód. Nie zrobiłem na ten temat jeszcze żadnej notki. No to nadrabiam ten brak i publikuję przykład mojej działalności zawodowej. Wybrałem mały kawałek, ale tak by był ciekawy i stanowił odrębną całość. Oczywiście niech nikt teraz dalej tego nie czyta, bo to jest dla moich prawnuków, którzy przeczytają to za sto lat. Fajnie by było poczytać co myślał nasz pradziad sto lat temu, nie? I fajnie wiedzieć jak na to zarabiał, by myśleć.
To jest procedura w języku T-SQL, która generuje inną procedurę, która generuje inną procedurę - a wszystko po to by wygenerować skrypt dodający do tabeli dane - po to by utworzyć skrypt instalacyjny jakiejś bazy danych, w którym wypełniamy danymi różne tabele konfiguracyjne. Daleko jej do tego by przedstawiać ją jako jakiś sensowny kawałek kodu do naśladowania - nie ma w tym komentarzy, nie jest całkiem uniwersalne, zostało zrobione na chybcika i bardzo dawno temu. Ta procedura jest bez sensu, takie sprawy fachowo załatwia się inaczej, niemniej działa i myślę, że to wystarczy, by całkowicie zademonstrować mój zawód. Dodatkowo piękno tej procedury leży w tym (a większość informatyków uzna to za kompromitującą wadę), że łatwiej ją napisać od nowa niż zrozumieć.
A wygląda tak:
 
CREATE PROCEDURE [dbo].[generuj_skrypt_wypelniajacy]
       @tabela varchar(50)
AS
BEGIN
       DECLARE pola_cur INSENSITIVE CURSOR
       FOR
             SELECT
                    syscolumns.name AS pole,
                    systypes.name AS typ,
                    syscolumns.length AS dlugosc
             FROM  
                    systypes INNER JOIN
                    syscolumns INNER JOIN
                    sysobjects
                           ON syscolumns.id = sysobjects.id
                           ON systypes.xtype = syscolumns.xtype
             WHERE 
                    systypes.status = 0 AND
                    sysobjects.name = @tabela
       FOR READ ONLY
 
       DECLARE     
             @pole varchar(30),
             @typ varchar(30),
             @dlugosc int,
             @declare varchar(8000),
             @insert varchar(8000),
             @into varchar(8000),
             @values varchar(8000),
             @proc varchar(8000),
             @select varchar(8000),
             @drop varchar(1000),
             @proc1 varchar(50),
             @proc2 varchar(50),
             @first smallint,
             @a char(1)
 
       SELECT @a = char(39)
       SELECT @first = 1
      
       OPEN pola_cur
 
       FETCH NEXT FROM pola_cur INTO @pole, @typ, @dlugosc
 
       WHILE @@FETCH_STATUS = 0
       BEGIN
             IF @pole not in
                   ('Kto_utworzyl','Kto_modyfikowal','Data_utworzenia',
                    'Data_modyfikacji','create_date','Update_date',
                    'Create_by','Update_by')
             BEGIN
                    IF @first = 1
                    BEGIN
                           IF @typ<>'text'
                           BEGIN
                                  select @declare =
                                        ' DECLARE @' + @pole + ' ' + @typ
                                  select @insert =
                                        ' INSERT INTO '+@tabela+' (' +@pole
                                  select @into =
                                        '@' + @pole
                                  select @select = @pole
                                  IF     @typ='char' or @typ = 'varchar' or
                                        @typ = 'datetime'
                                        select @values =
                                               '+@a+rtrim(isnull(convert(varchar(300),
                                               @'+@pole+'),'+@a+'null'+@a+'))+@a'
                                  ELSE
                                        select @values =
                                               '+isnull(convert(varchar(300),@' +
                                               @pole+'),'+@a+'null'+@a+')'
                                  select @first = 0
                           END
                    END ELSE
                    BEGIN
                           IF @typ <> 'text'
                           BEGIN
                                  select @declare = @declare +
                                        ',@' + @pole + ' ' + @typ
                                  select @insert = @insert +
                                        ',' +@pole
                                  select @into = @into +
                                        ',@' + @pole
                                  select @select = @select + ',' + @pole
                                  IF     @typ in('char','varchar','datetime')
                                        select @values = @values +
                                               '+' + @a + ',' + @a +
                                               '+@a+rtrim(isnull(convert(varchar(300),
                                               @'+@pole+'),'+@a+'null'+@a+'))+@a'
                                  ELSE
                                        select @values = @values +
                                               '+' + @a + ',' + @a +
                                               '+isnull(convert(varchar(300),@' +
                                               @pole+'),'+@a+'null'+@a+')'
                           END
                    END
                    IF @typ = 'char' or @typ = 'varchar'
                           select @declare = @declare +
                                  '(' + convert(varchar(4), @dlugosc) + ')'
             END
             FETCH NEXT FROM pola_cur INTO @pole, @typ, @dlugosc
       END
 
       close pola_cur
       DEALLOCATE pola_cur
 
       SELECT @proc1 = 'gen_'+@tabela+ '_1'
       SELECT @proc2 = 'gen_'+@tabela
 
       SELECT @proc= '
             CREATE PROCEDURE '+@proc1+ '
             AS
             BEGIN
                    ' + @declare+'
                    DECLARE      @proc varchar(8000),
                                  @drop varchar(1000),
                                  @a char(1)
                    SELECT @a = char(39)
                    SELECT @proc=' + @a + ' ' +@a +'
                    DECLARE tabela_cur INSENSITIVE CURSOR FOR
                           SELECT '+@select+'
                           FROM '+@tabela+'
                    FOR READ ONLY
                    OPEN tabela_cur
                    FETCH NEXT FROM tabela_cur INTO '+@into+'
                    WHILE @@FETCH_STATUS = 0
                    BEGIN
                           select @proc = @proc +' + @a + @insert + ') VALUES
                                  (' + @a + @values +' +' + @a + ')' + @a +'
                           IF len(@proc)>7500 goto koniec
                           FETCH NEXT FROM tabela_cur INTO ' + @into + '
                    END
                    koniec:
                    SELECT @drop = ('+@a+'
                    if exists (select * from sysobjects where id = object_id('+
                           @a+'+@a+' + @a + @proc2 + @a +'+@a+' + @a + ') and
                           OBJECTPROPERTY(id, ' + @a +'+@a+' + @a + 'IsProcedure'+
                           @a+'+@a+' + @a + ') = 1)
                           drop procedure '+@proc2+ @a + ')
                    EXECUTE (@drop)
                    EXECUTE ('+@a+'CREATE PROCEDURE '+@proc2+ '
                    AS
                    BEGIN '+@a+'+
                    @proc +'+@a+'
                    END'+@a+')
 
                    close tabela_cur
                    deallocate tabela_cur
             END'
 
       SELECT @drop=
             'if exists (select * from sysobjects where id = object_id('+
             @a + @proc1 + @a + ') and
             OBJECTPROPERTY(id, '+@a+'IsProcedure'+@a+') = 1)
             drop procedure '+@proc1
 
       EXEC(@drop)
 
       EXEC(@proc)
 
       EXEC(@proc1)
 
       EXEC(@drop)
 
END
Grzegorz GPS Świderski

Koneczny o UE <- poprzednia notka
następna notka -> Kara śmierci a pomyłka

 

GPS
O mnie GPS

Blo­ger, że­gla­rz, informatyk, trajk­ka­rz, sar­ma­to­li­ber­ta­ria­nin, fu­tu­ry­sta. My­ślę, po­le­mi­zu­ję, ar­gu­men­tu­ję, po­li­ty­ku­ję, fi­lo­zo­fu­ję.

Nowości od blogera

Komentarze

Inne tematy w dziale Rozmaitości