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
Bloger, żeglarz, informatyk, trajkkarz, sarmatolibertarianin, futurysta AI. Myślę, polemizuję, argumentuję, politykuję, filozofuję, łapówki przyjmuję: suppi.pl/gps65
Nowości od blogera
Inne tematy w dziale Rozmaitości