Advertisement
Wolfinstein

all

Jun 20th, 2017
582
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 24.05 KB | None | 0 0
  1. /*
  2. --------------------------------------TRIGGER------------------------------------------
  3. /*
  4. create table [zarobki_audyt]
  5. (
  6.     ID_zarobki_audyt bigint not null identity(1,1),
  7.     ID_zarobki bigint not null,
  8.     data datetime not null,
  9.     brutto money not null,
  10.     ID_pracownicy bigint not null,
  11.     operacja varchar(6) not null,
  12.     data_operacji datetime not null
  13. );
  14.  
  15. alter table [zarobki_audyt] add constraint [PK_zarobki_audyt]
  16. primary key (ID_zarobki_audyt);
  17.  
  18. go
  19.  
  20. alter table [zarobki_audyt] add constraint [CHK_operacja]
  21. check(upper(operacja) = 'INSERT' or upper(operacja) = 'UPDATE' or upper(operacja) = 'DELETE');
  22.  
  23. go
  24.  
  25. --usuniêcie constrainta
  26. --alter table zarobki_audyt drop CHK_operacja
  27.  
  28. create trigger tr_audyt
  29. on [zarobki]
  30. after INSERT, update, delete
  31. as
  32. begin
  33.     if not exists (select * from [deleted]) and exists (select * from [INSERTed])
  34.     begin
  35.         INSERT into [zarobki_audyt] (ID_zarobki, data, brutto, ID_pracownicy, operacja, data_operacji)
  36.         (select ID_zarobki, data, brutto, ID_pracownicy, 'INSERT', getdate() from [INSERTed]);
  37.     end
  38.     else if exists(select * from [deleted]) and not exists(select * from [INSERTed])
  39.     begin
  40.         INSERT into zarobki_audyt (ID_zarobki, data, brutto, ID_pracownicy, operacja, data_operacji)
  41.         (select ID_zarobki, data, brutto, ID_pracownicy, 'UPDATE', getdate() from [deleted]);
  42.     end
  43.     else if exists(select * from [deleted]) and exists(select * from [INSERTed])
  44.     begin
  45.         INSERT into zarobki_audyt (ID_zarobki, data, brutto, ID_pracownicy, operacja, data_operacji)
  46.         (select ID_zarobki, data, brutto, ID_pracownicy, 'UPDATE', getdate() from [deleted]);
  47.     end
  48. end
  49.  
  50. INSERT into [zarobki] (data, brutto, ID_pracownicy) values ('01/01/06', 1350, 1)
  51. select * from zarobki_audyt
  52.  
  53. ____________________
  54. create trigger tr_zarobki
  55. on zarobki
  56. instead of delete
  57. as
  58. begin
  59.     update zarobki set aktualny='nie'
  60.     where zarID in (select zarID from deleted)
  61. end
  62.  
  63. ____________________________
  64. Dodaj kolumnê tekstow¹ login1 do tabeli pracownicy.
  65. Przy tworzeniu nowego pracownika lub modyfikacji istniej¹cego
  66. w tabeli pracownicy ustawiaj wartoϾ kolumny login1
  67. na pierwsz¹ i ostatni¹ literê z imienia i pierwsz¹ i ostatni¹ liter¹ nazwiska. W tak stworzonej
  68. wartoœci zastosuj wielkie litery.
  69. Przyk³ad dla osoby: Tomasz Pawlak login1 bêdzie sk³¹da³ siê z TZPK
  70.  
  71. alter table pracownicy add login1 varchar(10)
  72.  
  73. alter trigger znaki on pracownicy
  74.     for INSERT, update
  75. as
  76. begin
  77.     declare @symbol_imie varchar(2)
  78.     declare @symbol_nazwisko varchar(2)
  79.     declare @symbol varchar(4)
  80.  
  81.     declare @imie_wynik varchar(10)
  82.     declare @nazwisko_wynik varchar(10)
  83.     declare @pracid_wynik varchar(10)
  84.  
  85.     set @imie_wynik=(select imie from INSERTed)
  86.     set @nazwisko_wynik=(select nazwisko from INSERTed)
  87.     set @pracid_wynik=(select ID_pracownicy from INSERTed)
  88.  
  89.     set @symbol_imie  = SUBSTRING(@imie_wynik, 1, 1) + SUBSTRING(@imie_wynik, len(@imie_wynik), len(@imie_wynik));
  90.     set @symbol_nazwisko = SUBSTRING(@nazwisko_wynik, 1, 1) + SUBSTRING(@nazwisko_wynik, len(@nazwisko_wynik), len(@nazwisko_wynik));
  91.  
  92.     set @symbol = upper(@symbol_imie + @symbol_nazwisko)
  93.  
  94.     update pracownicy set login1 = @symbol where ID_pracownicy = @pracid_wynik
  95. end
  96.  
  97. INSERT into pracownicy(nazwisko,imie) values('Ziomet','Damiax');
  98. update pracownicy set imie = 'Darek' where ID_pracownicy = 2
  99.  
  100. select * from pracownicy
  101. _____________________________
  102. Do tabeli dzia³y dopisz kolumnê data_przyjêcia.
  103. Przy tworzeniu nowego pracownika z ustawionym dzia³em
  104. ustawiaj wartoœæ kolumny data_przyjêcia dla zadanego dzia³u
  105. wpisuj¹c w ni¹ komunikat z obecn¹ dat¹ oraz imieniem i nazwiskiem pracownika.
  106. Format komunikatu:
  107. 'Ostatni zatrudniony pracownik Jan Kowalski: Dec 18 2006  9:01PM'
  108.  
  109. select * from dzialy
  110.  
  111. alter table dzialy add data_przyjecia varchar(150)
  112.  
  113. alter trigger tr_dzial
  114. on pracownicy
  115.     for INSERT
  116. as
  117. begin
  118.     declare @dzialID integer,
  119.             @imie varchar(32),
  120.             @nazwisko varchar(32),
  121.             @ins varchar(150)
  122.  
  123.     set @dzialID=(select dzialID from INSERTed)
  124.  
  125.     if @dzialID is not null
  126.     begin
  127.         set @imie=(select imie from INSERTed)
  128.         set @nazwisko=(select nazwisko from INSERTed)
  129.  
  130.         set @ins=('Ostatni zatrudniony pracownik '+@imie+' '+@nazwisko+': '+convert(char(20), GETDATE(),109))
  131.  
  132.         update dzialy set data_przyjecia = @ins
  133.         where dzialID = @dzialID
  134.     end
  135. end
  136.  
  137. select * from pracownicy
  138. select * from dzialy
  139.  
  140. INSERT into pracownicy(imie, nazwisko, dzialID, wiek) values ('Imie', 'Nazwisko', 3, 25)
  141. INSERT into pracownicy(imie, nazwisko) values ('Imie', 'Nazwisko')
  142.  
  143. ______________________________
  144. Stworzyæ wyzwalacz (trigger) na tabeli – zamowienia – który uruchomiony jest po wstawieniu rekordu do tej tabeli.
  145. Wyzwalacz ma wstawiæ do tabeli – dane – dane klienta z tabeli – klienci – oraz zaktualizowaæ kolumny w tabeli – zamowienia:
  146. - numer zamówienia – zwiêkszyæ o 1 ostatni¹ wartoœæ;
  147. - data realizacji zamówienia – dodaæ 7 dni do daty dodania zamówienia.
  148.  
  149. create trigger zadanie1 on zamowienia
  150. for INSERT
  151. as
  152. begin
  153.     INSERT into dane (imie, nazwisko, adres, miasto, kod_pocztowy) values
  154.     ((select imie from klienci), (select nazwisko from klienci),(select adres from klienci),
  155.     (select miasto from klienci), (select kod_pocztowy from klienci) )
  156.    
  157.     update zamowienia set ID_zamowienia = ID_zamowienia + 1 where ID_zamowienia =
  158.     (select ID_zamowienia from INSERTed)
  159.     update zamowienia set Data_dos = dateadd(day,7,data_zam) where ID_zamowienia =
  160.     (select ID_zamowienia from INSERTed)
  161. end
  162.  
  163. ___________________________
  164. Do tabeli pracownicy dodaj kolumnê tekstow¹ last_sallary.
  165. Przy tworzeniu nowego wpisu w tabeli zarobki ustawiaj wartoϾ nowo dodanej kolumny
  166. dla pracownika, który otrzyma³ wynagrodzenie wpisuj¹c w ni¹ komunikat z obecn¹ dat¹.
  167. Wymagany format komunikatu:
  168. 'Data ostatniej wyp³aty: Jan 03 2006  10:11PM'
  169.  
  170. alter table pracownicy alter column last_sallary varchar(50)
  171.  
  172. select * from pracownicy
  173. select * from zarobki
  174.  
  175. alter trigger zad2 on zarobki
  176. for INSERT,update
  177. as
  178. begin
  179.     update pracownicy set last_sallary = ('Data ostatniej wyp³aty: ' + (convert(varchar,getdate())))
  180.     where pracID = (select pracID from INSERTed)
  181. end
  182.  
  183. INSERT into zarobki (brutto,pracID) values (12345,6)
  184.  
  185. _______________________________
  186.  
  187. stwórz triggera który przenosi dane dotycz¹ce zarobków
  188. do tabeli historycznej bêd¹cej dok³adn¹ kopi¹ tabeli
  189. zarobki bez kolumny aktualny. Uwzglêdnij w tej tabeli datêf
  190. przenosin oraz u¿ytkownika który kasowa³ dane
  191.  
  192. create table zapasowa(
  193. ID_zarobki int, data datetime, brutto money, ID_pracownicy int,
  194.     dataprzeniesienia datetime, kto varchar(30))
  195.     ;
  196.  
  197. alter trigger kopia_ on zarobki
  198. for delete
  199.  
  200. as begin
  201.     INSERT into zapasowa(ID_zarobki, data, brutto, ID_pracownicy, dataprzeniesienia, kto)
  202.     (select ID_zarobki, data, brutto, ID_pracownicy, getdate(), user from deleted);
  203. end
  204. go
  205.  
  206. INSERT into zarobki
  207. values ('2014-07-07', 1000, 3);
  208.  
  209. delete from zarobki
  210. where ID_zarobki = 28
  211.  
  212. select * from zapasowa
  213.  
  214. SELECT 'DROP TRIGGER ' + name
  215. FROM sysobjects
  216. WHERE type = 'tr'
  217. _____________
  218.  
  219. Do tabeli pracownicy dodaj kolumne tekstowa email o dlugosci 100 znakow.
  220. Podczas tworzenia pracownika lub jego modyfikacji uzupe³nij t¹ kolumnê
  221. emailem skladaj¹cym siê z:
  222. pierwszych trzech liter imienia, kropki,
  223. pierwszych piêciu liter nazwiska oraz ci¹gu '@p.lodz.pl'
  224. Pamiêtaj, aby usun¹c ewentualne zewnêtrzne bia³e znaki oraz
  225. aby zamienic wewnêtrzne spacje na znak podkreslenia.
  226.  
  227. select * from pracownicy
  228. alter table pracownicy add email varchar(100)
  229.  
  230. create trigger zadanie4 on pracownicy
  231. for INSERT, update
  232. as
  233. begin
  234.     declare @imie varchar(20) = (select imie from INSERTed)
  235.     declare @nazwisko varchar(40) = (select nazwisko from INSERTed)
  236.     declare @wynik varchar(30) = ''
  237.     set @wynik = LEFT(@imie,3) + '.' + LEFT(@nazwisko, 5) + '@p.lodz.pl'
  238.     update pracownicy set email = @wynik where imie = (select imie from INSERTed)
  239.     and nazwisko = (select nazwisko from INSERTed)
  240. end
  241.  
  242. INSERT into pracownicy(imie, nazwisko, email) values ('Janusz', 'Nowacki')
  243.  
  244. ---------------------PROCEDURES-----------------------------
  245. _________________________
  246. alter procedure zadanie
  247.     @data datetime = null
  248. as
  249. begin
  250.     if @data is null
  251.     begin
  252.         set @data = GETDATE()
  253.         print 'Dzisiaj mamy: '+cast(@data as varchar)
  254.     end
  255.     select case DATEPART (dw,@data)
  256.         when 1 then 'niedziela'
  257.         when 2 then 'poniedzia³ek'
  258.         when 3 then 'wtorek'
  259.         when 4 then 'œroda'
  260.         when 5 then 'czwartek'
  261.         when 6 then 'pi¹tek'
  262.         when 7 then 'sobota'
  263.     end
  264. end
  265. go
  266. exec zadanie
  267. exec zadanie '24/05/2008'
  268. ___________________________
  269. Utwórz procedurê , która wyœwietli w formie tekstowej (w oknie messages)
  270. wszystkich pracowników i liczbê ich wyp³at. Pod uwagê bierz tylko tych pracowników,
  271. którzy posiadaj¹ wiêcej ni¿ X (gdzie X to pierwszy parametr procedury)
  272. wpisów w tabeli zarobki. Dodatkowo wybierz tylko te wpisy, które zosta³y stworzone po
  273. dacie podanej w drugim parametrze. W przypadku nie podania w wywo³aniu procedury
  274. drugiego parametru nie uwzglêdniaj kryterium daty.
  275. Przyk³adowy wynik wywo³ania:
  276. 'Pracownik Jan Kowalski od dnia Jan  1 2001 12:00AM otrzyma³ 5 wyp³at'
  277. lub
  278. 'Pracownik Jan Kowalski otrzyma³ 5 wyp³at'
  279.  
  280. alter proc qqwe11
  281.         @quantity int,
  282.         @data_od date =''
  283. AS
  284. BEGIN
  285.     declare @temporary table(id int identity (1,1), imie varchar(20), nazwisko varchar(20), ID_pracownicy int , ile int)
  286.     declare @output varchar (100)
  287.     declare @i int
  288.     if @data_od IS NULL
  289.         begin
  290.             INSERT into @temporary(imie, nazwisko, ID_pracownicy, ile)
  291.                 SELECT t1.imie, t1.nazwisko, t1.ID_pracownicy,  t1.ile FROM
  292.                     (
  293.                     select COUNT(*) as ile,  zarobki.ID_pracownicy, pracownicy.imie, pracownicy.nazwisko from zarobki
  294.                     JOIN pracownicy
  295.                     on pracownicy.ID_pracownicy = zarobki.ID_pracownicy
  296.                         group by zarobki.ID_pracownicy, pracownicy.imie, pracownicy.nazwisko
  297.                     ) as t1
  298.                         where t1.ile >= @quantity      
  299.  
  300.              set @i=(select COUNT(*) from @temporary)
  301.              while (@i > 0)
  302.              begin
  303.                 set @output=concat('Pracownik ',(select imie from @temporary where id=@i),' ',(select nazwisko from @temporary where id=@i),' otrzymal ',(select ile from @temporary where id=@i),' wyplat')
  304.                 print @output
  305.                 set @i-=1
  306.              end
  307.         end
  308.     else
  309.         begin  
  310.             INSERT into @temporary(imie, nazwisko, ID_pracownicy, ile)
  311.                 SELECT t1.imie, t1.nazwisko, t1.ID_pracownicy,  t1.ile FROM
  312.                 (
  313.                     select COUNT(*) as ile,  zarobki.ID_pracownicy, pracownicy.imie, pracownicy.nazwisko from zarobki
  314.                     JOIN pracownicy
  315.                     on pracownicy.ID_pracownicy = zarobki.ID_pracownicy
  316.                         where data >= @data_od
  317.                             group by zarobki.ID_pracownicy, pracownicy.imie, pracownicy.nazwisko
  318.                 ) as t1
  319.                     where t1.ile >= @quantity
  320.                
  321.              set @i=(select COUNT(*) from @temporary)
  322.              while (@i > 0)
  323.              begin
  324.                 set @output=concat('Pracownik ',(select imie from @temporary where id=@i),' ',(select nazwisko from @temporary where id=@i),' otrzymal ',(select ile from @temporary where id=@i),' wyplat/y')
  325.                 print @output
  326.                 set @i-=1
  327.             end
  328.         end        
  329. END
  330.  
  331. exec qqwe11 2, '2005/01/01'
  332.  
  333. ______________________________________
  334.  
  335. Stwórz procedurê, która wyœwietli w formie tekstowej (w oknie messages) co drugiego pracownika
  336. pracownika, którego nazwisko zaczyna siê na literê podan¹ w parametrze. W przypadku nie podania
  337. parametru uwzglêdniaj tylko osoby o nazwisku na literê 'Z'. W przypadku podania w parametrze wartosci
  338. null nie uwzglêdniaj kryterium.
  339.  
  340. alter procedure qwerty
  341. @param varchar(1) = '0'
  342.  
  343. AS
  344. begin
  345.  
  346. declare @flag as int
  347. if @param = '0'
  348. set @flag = 1
  349.  
  350. if @param IS NOT NULL
  351.     begin
  352.         if @flag = 1
  353.             begin
  354.                 Select imie, nazwisko From
  355.                 (
  356.                     Select imie, nazwisko, Row_number() over(order by imie) as 'pozycja'
  357.                     from pracownicy
  358.                         where imie like  'Z%'
  359.                 ) as t1
  360.                     where t1.pozycja % 2 =0
  361.             end
  362.         else
  363.             begin
  364.                 Select imie, nazwisko From
  365.                 (
  366.                     Select imie, nazwisko, Row_number() over(order by imie) as 'pozycja'
  367.                     from pracownicy
  368.                         where imie like @param + '%'
  369.                 ) as t1
  370.                     where t1.pozycja % 2 =0
  371.         end
  372.     end
  373. else
  374.     begin
  375.         Select imie, nazwisko From
  376.         (
  377.             Select imie, nazwisko, Row_number() over(order by imie) as 'pozycja'
  378.             from pracownicy
  379.         ) as t1
  380.             where t1.pozycja % 2 = 0
  381.     end
  382. end
  383.  
  384. exec dbo.qwerty 'J' -- Null -- pusto
  385. ______________________________________
  386. Procedura wybieraj¹ca nazwiska pracowników których œrednie zarobki s¹ najwy¿sze
  387. lub równe parametru wejsciowemu
  388. Albo (Procedura wybieraj¹ca pracowników których œrednie zarobki s¹ najwy¿sze
  389. lub najni¿sze) (zak³adamy unikatowoœæ nazwisk pracownikow)
  390.  
  391. drop proc procedura_2
  392. go
  393. create proc procedura_2
  394.         @wej_srd money
  395.     as
  396.     begin
  397.         select nazwisko, AVG(brutto) sred from pracownicy p
  398.         join zarobki z on z.pracID=p.pracID
  399.             group by p.nazwisko
  400.                 having AVG(brutto)=
  401.                 (
  402.                     select MAX(wynik.sred) from
  403.                 (
  404.                     select nazwisko, AVG(brutto) sred from pracownicy p
  405.                     join zarobki z on z.pracID=p.pracID
  406.                         group by p.nazwisko
  407.                 ) wynik
  408.         )
  409.         union
  410.             select nazwisko, AVG(brutto) sred from pracownicy p
  411.             join zarobki z on z.pracID=p.pracID
  412.                 group by p.nazwisko
  413.                     having AVG(brutto)= @wej_srd
  414.     end;
  415. go
  416. exec procedura_2 5600
  417.  
  418. _______________________
  419. drop proc procedura_3
  420. go
  421. create proc procedura_3
  422.     @ilosc integer
  423. as
  424. begin
  425.     declare @nazw varchar(50)
  426.     set @nazw='puste'
  427.     print @nazw
  428.     select @nazw = nazwisko from pracownicy
  429.     order by nazwisko
  430.     print @nazw
  431.     if LEN(@nazw)>10
  432.     print 'Wieksza'
  433.     else print 'Mniejsza'
  434.     declare @i integer
  435.     set @i = 0
  436.     while @i < @ilosc
  437.     begin
  438.         print 'Przebieg nr '+cast(@i as varchar)
  439.         set @i = @i+1
  440.     end
  441. end
  442. go
  443. exec procedura_3 1000
  444. __________________
  445.  
  446. --zwróc adres w po0staci
  447. --Piotrkowska
  448. --123/23
  449. --m.30
  450. --90-123
  451. --£ódŸ
  452.  
  453. alter procedure adres
  454. @adres_caly varchar(100)
  455. as
  456. begin
  457.     declare @dl_ul int
  458.     declare @pozycja int
  459.     declare @reszta varchar(100)
  460.     set @reszta = @adres_caly
  461.     set @pozycja = CHARINDEX(' ',@reszta)
  462.     print substring(@reszta,0,@pozycja+1)
  463.     while(LEN(@reszta)>2)
  464.     begin
  465.         set @reszta=SUBSTRING(@reszta,@pozycja+1,LEN(@reszta))
  466.         set @pozycja = CHARINDEX(' ',@reszta)
  467.         print substring(@reszta,0,@pozycja+1)
  468.     end    
  469. end
  470.  
  471. exec adres 'piotrkowska 123/23 m.30 90-123 lodz '
  472.  
  473. ---------------------------FUNCTIONS----------------------------------
  474.  
  475. Dodaj funkcjê fun_kol, która zwróci tekstow nazwê dnia tygodnia powsta³¹
  476. z daty powsta³ej z dodania X dni (gdzie X to drugi parametr) do daty podanej
  477. w pierwszym parametrze.
  478. W przypadku ustawienia null w parametrze X dodaj 10 dni. Przyk³adowy wynik wywo³ania funkcji:
  479. 'Otrzymany dzieñ to: Sunday'
  480.  
  481. alter function fun_kol(@data1 date, @dni int)
  482. returns varchar(100)
  483. as
  484. begin
  485. declare @wynik varchar(100)
  486.     if @dni is null
  487.         set @dni = 10
  488.     set @wynik = 'Otrzymany dzien to: ' + convert(Varchar,datename(dw,dateadd(day,@dni,@data1)))
  489.     return @wynik
  490. end
  491.  
  492. select dbo.fun_kol('2017-02-02',22)
  493. select dbo.fun_kol('2017-02-02',null)
  494.  
  495.  
  496. ________________
  497. Utwórz funkcje, która bêdzie zwracaæ powtórzony ciag znaków podany w parametrze tyle razy
  498. ile podane to bêdzie w nastêpnym parametrze. Co drugie powielenie ci¹gu wejœciowego ma mieæ
  499. odwrócon¹ kolejnoœæ znaków poczynaj¹c od pierwszego. Pomiedzy powieleniami dodaj podkreslnik.
  500. Przyk³adowe wywo³anie dla ci¹gu 'XYZ' i powielenia 3 - 'ZYX_XYZ_ZYX'.
  501.  
  502. alter function zad5(@ciag varchar(10), @powt int) RETURNS varchar(100)
  503. AS
  504. BEGIN
  505. declare @i int;
  506. declare @zwrot varchar(30);
  507.  
  508. set @i= 1
  509. set @zwrot=@ciag
  510.  
  511. while @i < @powt
  512.     begin
  513.         set @i += 1
  514.         set @zwrot=CONCAT(@zwrot, '_')
  515.    
  516.     if(@i%2=0)
  517.         begin
  518.             set @zwrot=CONCAT(@zwrot, reverse(@ciag))
  519.         end
  520.     else
  521.         begin
  522.             set @zwrot=CONCAT(@zwrot, @ciag)
  523.         end
  524.     end
  525.  
  526. RETURN @zwrot
  527. END
  528.  
  529. select dbo.zad5('xyz', 6)
  530. ______________________________________
  531. Utwórz funkcjê, która bêdzie zwracaæ komunikat o ró¿nicy w dniach
  532. miêdzy dat¹ bie¿¹c¹ a dat¹ podan¹ w parametrze.
  533. W przypadku tego samego dnia zwróæ komunikat o równoœci dat.
  534. Przyk³ad:
  535. 'Miêdzy dat¹ obecn¹ a dat¹ Dec 12 2012 12:00AM jest XXX dni ró¿nicy.'
  536. lub
  537. 'Daty data podana w parametrze jest dat¹ dzisiejsz¹.'
  538.  
  539. alter function checkData (@data date) returns varchar(150)
  540. as
  541. begin
  542.     declare @output varchar(150)
  543.     declare @difference int
  544.  
  545.     set @difference = DATEDIFF(day, @data, GETDATE()) ;
  546.  
  547.     if @difference >= 1 OR @difference <= -1
  548.         begin
  549.             set @output = 'Różnica pomiędzy ' + CONVERT(varchar(10),@data) +
  550.                           ' a dziejszą datą to ' + convert(varchar(2),@difference)+'  dni/dzien';
  551.         end
  552.     else
  553.         begin
  554.             set @output = 'To dziś !';    
  555.         end
  556.     return @output
  557. end
  558.  
  559. select dbo.checkData('06/20/2017')
  560.  
  561. ______________________________________
  562. Case z mlody,stary + tabela
  563.  
  564. alter function Wiek(@wiek int)
  565. returns varchar(max)
  566. as
  567. begin
  568.     declare @wynik varchar(max);
  569.     if @wiek < 25
  570.         begin
  571.             set @wynik = 'Mlody';
  572.         end
  573.     else if @wiek >= 26 and @wiek <= 45
  574.         begin
  575.             set @wynik = 'Œredni';
  576.         end
  577.     else if @wiek >= 45
  578.         begin
  579.             set @wynik = 'Stary';
  580.         end
  581.     else
  582.         begin
  583.             set @wynik = 'Nieznany';
  584.         end
  585.     return @wynik;
  586. end;
  587.  
  588. select imie,nazwisko,wiek, dbo.Wiek(wiek)
  589. as 'Jaki wiek' from pracownicy
  590.  
  591. ______________________________________
  592. --Liczenie pola kwadratu, prostok¹ta, ko³a, trójk¹ta, rombu i równoleg³oboku
  593. alter function Pola(@figura varchar(20),
  594. @bok1 float, @bok2 float =0)
  595. returns float
  596. as
  597. begin
  598.     declare @wynik float;
  599.     if lower(@figura) = 'kwadrat'
  600.         begin
  601.             set @wynik = dbo.potega(@bok1);
  602.         end
  603.     else if lower(@figura) = 'prostok¹t'
  604.         begin
  605.             set @wynik = @bok1 * @bok2;
  606.         end
  607.     else if lower(@figura) = 'ko³o'
  608.         begin
  609.             set @wynik = PI()*dbo.potega(@bok1);
  610.         end
  611.     else if lower(@figura) = 'romb' or lower(@figura) = 'równoleg³obok'
  612.         begin
  613.             set @wynik = @bok1 * @bok2;
  614.         end
  615.     else if lower(@figura) = 'trójk¹t'
  616.         begin
  617.             set @wynik = (@bok1 * @bok2)/2;
  618.         end
  619.     return @wynik;
  620. end;
  621.  
  622. ___________________________
  623. stwórz funkcjê, która bêdzie przyjmowaæ 2 argumenty bêd¹ce ci¹gami znaków (maksymalnie do 100 znaków) i zwróci ci¹g znaków
  624. powsta³y z wymieszania na przemian znaków
  625. PRZYK£AD:
  626. funkcja('ABCDE','12345') zwróci: 5E4D3C2B1A
  627. W przypadku niezgodnoœci d³ugoœci ci¹gów wejœciowych wyœwietl komunikat typu: 'B³¹d d³ugoœci znaków X<>Y'
  628. gdzie X i Y to d³ugoœci ci¹gów wejœciowych
  629.  
  630. create function mieszanie(@nap1 varchar(100), @nap2 varchar(100))
  631. returns varchar(200)
  632. as
  633. begin
  634.     if LEN(@nap1) != LEN(@nap2)
  635.         return 'B³¹d d³ugoœci znaków: ' + cast(len(@nap1) as varchar)+' <> '+ cast(len(@nap2) as varchar)
  636.  
  637.     declare @licznik int;
  638.     declare @result varchar(200);
  639.  
  640.     set @licznik = 0;
  641.     set @result = '';
  642.    
  643.     while (@licznik <= LEN(@nap1))
  644.     begin
  645.         set @licznik = @licznik + 1
  646.         set @result = @result + SUBSTRING (@nap1, @licznik - 1,1)
  647.         set @result = @result + SUBSTRING (@nap2, @licznik - 1,1)
  648.     end
  649.     return reverse(@result)
  650. end
  651.  
  652. select dbo.mieszanie('ABCDEAAAAAAAAAAAAAAAAA','4254252354234124523451')
  653. ______________________________
  654. create function dbo.Split(@string varchar(max),
  655. @delimiter varchar(5))
  656. returns @wynik table(tekst varchar(max))
  657. as
  658. begin
  659.     declare @poczatek int;
  660.     declare @koniec int;
  661.  
  662.     set @poczatek = 1
  663.     set @koniec = CHARINDEX(@delimiter, @string);
  664.     while @poczatek <= LEN(@string)
  665.     begin
  666.         if @koniec = 0
  667.             set @koniec = LEN(@string) + 1;
  668.  
  669.         INSERT into @wynik(tekst)
  670.         values (SUBSTRING(@string, @poczatek, @koniec - @poczatek));
  671.  
  672.         set @poczatek = @koniec + 1;
  673.         set @koniec = CHARINDEX(@delimiter, @string, @poczatek);
  674.     end
  675.     return;
  676. end;
  677.  
  678. select * from dbo.split('1,2,3,4,5,6',',');
  679. */
  680.  
  681. ________________***********++++++++++++++++++************_______________________
  682.  
  683. alter procedure qwerty
  684. @param varchar(1) = '0'
  685.  
  686. AS
  687. begin
  688.  
  689. declare @flag as int
  690. if @param = '0'
  691. set @flag = 1
  692.  
  693.     declare @temporary table(id int identity (1,1), imie varchar(20), nazwisko varchar(20))
  694.     declare @output varchar (100)
  695.     declare @i int
  696.  
  697.  
  698. if @param IS NOT NULL
  699.     begin
  700.         if @flag = 1
  701.             begin
  702.             INSERT into @temporary(imie, nazwisko)
  703.                 Select imie, nazwisko From
  704.                 (
  705.                     Select imie, nazwisko, Row_number() over(order by imie) as 'pozycja'
  706.                     from pracownicy
  707.                         where imie like  'Z%'
  708.                 ) as t1
  709.                     where t1.pozycja % 2 =0
  710.  
  711.              set @i=(select COUNT(*) from @temporary)
  712.              while (@i > 0)
  713.              begin
  714.                 set @output=concat((select imie from @temporary where id=@i),' ',(select nazwisko from @temporary where id=@i))
  715.                 print @output
  716.                 set @i-=1
  717.              end
  718.  
  719.             end
  720.         else
  721.             begin
  722.                 INSERT into @temporary(imie, nazwisko)
  723.                 Select imie, nazwisko From
  724.                 (
  725.                     Select imie, nazwisko, Row_number() over(order by imie) as 'pozycja'
  726.                     from pracownicy
  727.                         where imie like @param + '%'
  728.                 ) as t1
  729.                     where t1.pozycja % 2 =0
  730.  
  731.              set @i=(select COUNT(*) from @temporary)
  732.              while (@i > 0)
  733.              begin
  734.                 set @output=concat((select imie from @temporary where id=@i),' ',(select nazwisko from @temporary where id=@i))
  735.                 print @output
  736.                 set @i-=1
  737.              end
  738.         end
  739.     end
  740. else
  741.     begin
  742.         INSERT into @temporary(imie, nazwisko)
  743.         Select imie, nazwisko From
  744.         (
  745.             Select imie, nazwisko, Row_number() over(order by imie) as 'pozycja'
  746.             from pracownicy
  747.         ) as t1
  748.             where t1.pozycja % 2 = 0
  749.  
  750.             set @i=(select COUNT(*) from @temporary)
  751.              while (@i > 0)
  752.              begin
  753.                 set @output=concat((select imie from @temporary where id=@i),' ',(select nazwisko from @temporary where id=@i))
  754.                 print @output
  755.                 set @i-=1
  756.              end
  757.  
  758.     end
  759. end
  760.  
  761. exec dbo.qwerty NULL
  762.  
  763. /*
  764. Do tabeli pracownicy dodaj kolumne tekstowa poczta o dlugosci 200 znakow.
  765. Podczas dodawania i modyfikacji osoby ustaw tą kolumnę ciągiem złożonym z:
  766. pierwszych 5 liter nazwiska, myślnika,
  767. pierwszych trzech liter imienia oraz ciągu '@wp.pl'
  768. Pamiętaj, aby usunąc ewentualne zewnętrzne białe znaki oraz
  769. aby zamienic wewnętrzne spacje na znak '_'.
  770. */
  771.  
  772.  
  773. select * from pracownicy
  774. alter table pracownicy add poczta varchar(200)
  775.  
  776. create trigger zadanie4 on pracownicy
  777. for INSERT, update
  778. as
  779. begin
  780.     declare @imie varchar(20) = (select imie from INSERTed)
  781.     declare @nazwisko varchar(40) = (select nazwisko from INSERTed)
  782.     declare @wynik varchar(30) = ''
  783.  
  784.     set @wynik = LEFT(@nazwisko,5) + '-' + LEFT(@imie, 3) + '@wp.pl'
  785.     update pracownicy set poczta = @wynik where imie = (select imie from INSERTed)
  786.     and nazwisko = (select nazwisko from INSERTed)
  787. end
  788.  
  789. INSERT into pracownicy(imie, nazwisko, email) values ('Janusz', 'Nowacki')
  790.  
  791. /*
  792. Utwórz funkcję, która będzie zwracać komunikat o różnicy w dniach
  793. między datą bieżącą a datą podaną w parametrze.
  794. W przypadku tego samego dnia zwróć komunikat o równości dat.
  795. Przykład:
  796. 'Między datą obecną a datą Dec 12 2012 12:00AM jest XXX dni różnicy.'
  797. lub
  798. 'Daty data podana w parametrze jest datą dzisiejszą.'
  799. */
  800.  
  801.  
  802. alter function checkData (@dat date) returns varchar(150)
  803. as
  804. begin
  805.     declare @ret1 varchar(150), @rozn int
  806.     set @rozn = DATEDIFF(day, @dat, GETDATE()) ;
  807.  
  808.     if @rozn >= 1
  809.     begin
  810.         set @ret1 = 'Data ' + CONVERT(varchar(20),@dat) + ' rozni sie o ' + convert(varchar(3),@rozn)+' dni';
  811.     end
  812.     else
  813.     begin
  814.         set @ret1 = 'Data podana w parametrze jest data dzisiejsza';       
  815.     end
  816.     return @ret1
  817. end
  818.  
  819. select dbo.checkData('06/20/2017')
  820.  
  821. /*
  822. Stworzyć wyzwalacz (trigger) na tabeli – zamowienia – który uruchomiony jest po wstawieniu rekordu do tej tabeli.
  823. Wyzwalacz ma wstawić do tabeli – dane – dane klienta z tabeli – klienci – oraz zaktualizować kolumny w tabeli – zamowienia:
  824. - numer zamówienia – zwiększyć o 1 ostatnią wartość;
  825. - data realizacji zamówienia – dodać 7 dni do daty dodania zamówienia.
  826. */
  827.  
  828. create trigger zadanie1 on zamowienia
  829. for INSERT
  830. as
  831. begin
  832.     INSERT into dane (imie, nazwisko, adres, miasto, kod_pocztowy) values
  833.     ((select imie from klienci), (select nazwisko from klienci),(select adres from klienci),
  834.     (select miasto from klienci), (select kod_pocztowy from klienci) )
  835.    
  836.     update zamowienia set ID_zamowienia = ID_zamowienia + 1 where ID_zamowienia =
  837.     (select ID_zamowienia from INSERTed)
  838.     update zamowienia set Data_dos = dateadd(day,7,data_zam) where ID_zamowienia =
  839.     (select ID_zamowienia from INSERTed)
  840. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement