Advertisement
Wolfinstein

qqqq

Jun 7th, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 11.45 KB | None | 0 0
  1. /*                          //sterowanie zdalne
  2. CREATE PROCEDURE suma_1
  3.  
  4.     @a INTEGER,
  5.     @b INTEGER,
  6.     @wiek INTEGER OUTPUT
  7. AS
  8. BEGIN
  9.     SET @wiek = @a+@b
  10. END
  11.  
  12. */
  13.  
  14. -- Anonimowa / niejawna konwersja typów i ich wywołanie
  15. /*
  16. DECLARE @wynik INTEGER
  17. EXEC suma_1 1, 5, @wynik OUTPUT
  18. PRINT 'Suma to: ' +
  19. CONVERT(VARCHAR, @wynik) -- poza ciałem procedury || CAST w ciele procedury (dla dat wyłącznie CAST)
  20.  
  21.  
  22. --procedura srednia z 3 cyfr
  23. -- ograniczenie bledu wprowadzanych danych
  24.  
  25.  
  26. ALTER PROCEDURE suma_2
  27.  
  28.     @a INTEGER,
  29.     @b INTEGER,
  30.     @c INTEGER,
  31.     @suma FLOAT OUTPUT
  32. AS
  33. BEGIN
  34.  
  35.     IF @a is null or @b is null or @c is null
  36.         PRINT ' Podaj poprawne wartosci'
  37.     ELSE
  38.         SET @suma  = (@a + @b +@c)/3
  39.         print 'Srednia: ' +convert(VARCHAR, @suma)     
  40.     SET @suma = @a+@b+@c
  41.  
  42. END
  43.  
  44.  
  45. DECLARE @suma FLOAT
  46. EXEC suma_2 1, 5, 7, @suma OUTPUT
  47. PRINT 'Suma: ' + CONVERT(VARCHAR, @suma)
  48.  
  49.  
  50.  
  51.  
  52. --jaki dzien tygodnia
  53. --stanowi data wprowadzona
  54. --w przypadku braku wprowadzenia ustaw dzisiejszy dzien
  55.  
  56. SELECT DATENAME(month, GETDATE());
  57. SELECT DATENAME(day, GETDATE());
  58. SELECT DATENAME(dw, GETDATE());
  59.  
  60. SELECT DATEPART(dw, GETDATE()); -- zaczyna od niedzieli
  61.  
  62.  
  63.  
  64. ALTER PROCEDURE data_1
  65.  
  66.     @data DATETIME = NULL
  67.     AS
  68. BEGIN
  69.  
  70.     IF @data is null
  71.         BEGIN
  72.             SET @data = getdate()
  73.             PRINT 'Dzisiaj mamy: ' + cast(@data as varchar)
  74.         END
  75.  
  76.         SELECT CASE DATEPART(dw, @data)
  77.             WHEN 1 then 'Niedziela'
  78.             WHEN 2 then 'Poniedzialek'
  79.             WHEN 3 then 'Wtorek'
  80.             WHEN 4 then 'Sroda'
  81.             WHEN 5 then 'Czwartek'
  82.             WHEN 6 then 'Piatek'
  83.             WHEN 7 then 'Sobota'
  84.         END
  85. END
  86.  
  87. exec data_1
  88.  
  89. exec data_1 '10/10/2017'
  90.  
  91.  
  92.  
  93.  
  94. -- zwroc adres w postaci
  95. --Piotrkowska
  96. --123/23
  97. --m.30
  98. --90-123
  99. --Łódź
  100.  
  101. exec adres_1 'Piotrkowska 123/23 m.30 90-123 Łódź '
  102.  
  103.  
  104. CREATE PROCEDURE adres_1
  105.  
  106.     @adres_caly VARCHAR(100) as
  107.     BEGIN
  108.         DECLARE @dl_ul INTEGER
  109.         DECLARE @pozycja INTEGER
  110.         DECLARE @reszta VARCHAR(100)
  111.  
  112.         SET @reszta = @adres_caly
  113.         SET @pozycja = CHARINDEX(' ', @reszta)
  114.         PRINT SUBSTRING(@reszta, 0, @pozycja + 1)
  115.    
  116.     WHILE (LEN(@reszta) >2)
  117.         BEGIN
  118.             SET @reszta = SUBSTRING(@reszta, @pozycja +1, LEN(@reszta))
  119.             SET @pozycja  = CHARINDEX(' ',@reszta)
  120.             PRINT SUBSTRING (@reszta, 0, @pozycja +1)
  121.         END
  122.  
  123.     END
  124.    
  125.  
  126.  
  127.  
  128.  
  129. create FUNCTION zeroo() RETURNS INT
  130. AS
  131.     BEGIN
  132.     RETURN 0
  133. END
  134.  
  135.  
  136. select dbo.zeroo(), imie from pracownicy -- music byc dbo. na poczatku
  137.  
  138.  
  139. create FUNCTION f_param(@a INT, @b INT) RETURNS INT
  140. AS
  141.     BEGIN
  142.     RETURN @a +@b
  143. END
  144.  
  145. select dbo.f_param(10, 20)
  146. select dbo.f_param(5, 3) from pracownicy
  147.  
  148.  
  149.  
  150.  
  151. ALTER FUNCTION potega(@liczba float)
  152. RETURNS FLOAT
  153. AS
  154.     BEGIN
  155.     DECLARE @wyn FLOAT
  156.     SET @wyn = POWER(@liczba,2)
  157.     RETURN @wyn
  158. END
  159.  
  160.  
  161. DECLARE @a float, @wynik float
  162. set @a = 135
  163. set @wynik = dbo.potega(@a)
  164. print cast(@a as varchar) + ' do kwadratu to '
  165. + cast (@wynik as varchar)
  166.  
  167.    
  168. select (avg(wiek)) from Pracownicy;     -- potega w funkcji agregujacej
  169. select dbo.potega(avg(wiek)) from Pracownicy;
  170.  
  171.  
  172.  
  173.  
  174. -- funkcja bez BEGIN i END
  175.  
  176. CREATE FUNCTION fun_2(@filter varchar(3))
  177.     RETURNS TABLE
  178. AS
  179.     RETURN (SELECT imie, nazwisko from pracownicy
  180.                 where nazwisko like @filter)
  181.  
  182.  
  183. SELECT * FROM dbo.fun_2('n%');
  184.  
  185. -- to samo z  BEGIN i END
  186.  
  187. CREATE FUNCTION fun_z_begin(@filter varchar(3))
  188.     RETURNS
  189.     @tab_return table(imie varchar(50), nazwisko varchar(50))
  190. AS
  191.     BEGIN
  192.         INSERT INTO @tab_return
  193.             SELECT imie, nazwisko from pracownicy
  194.                 where nazwisko like @filter
  195.     RETURN
  196. END
  197.  
  198. SELECT * FROM dbo.fun_z_begin('n%');
  199.  
  200.  
  201.  
  202. -- funkcja wiek - alternatywa dla case
  203.  
  204. CREATE FUNCTION wiek_(@Wiek INT)
  205. RETURNS VARCHAR(MAX)
  206. AS
  207. BEGIN
  208.     DECLARE @Wynik VARCHAR(MAX)
  209.         IF @Wiek < 25
  210.             BEGIN
  211.                 SET @Wynik = 'Młody';
  212.             END
  213.         ELSE IF @Wiek >=26 and @Wiek <=45
  214.             BEGIN  
  215.                 SET @Wynik = 'Średni'
  216.             END
  217.         ELSE IF @Wiek >= 46
  218.             BEGIN
  219.                 SET @Wynik = 'Podeszły'
  220.             END
  221.         ELSE
  222.             BEGIN
  223.                 SET @Wynik = 'Nieznany'
  224.             END
  225.  
  226.     RETURN @Wynik;
  227.        
  228. END;
  229.  
  230.  
  231. SELECT imie, nazwisko, wiek, dbo.wiek_(wiek)
  232.     AS 'Jaki wiek ?' FROM pracownicy;
  233.  
  234.  
  235. -- Funkcja pola wybranej figury, kwadrat, prostokat, trojkat, romb albo rownoleglobok, kolo
  236.  
  237. CREATE FUNCTION pola_(@figura varchar(20), @bok float, @bok2 float = 0)
  238. RETURNS FLOAT
  239. AS
  240.     BEGIN
  241.         DECLARE @Wynik float;
  242.  
  243.         IF LOWER(@figura) = 'kwadrat'
  244.             BEGIN
  245.                 SET @Wynik = dbo.potega(@bok);
  246.             END
  247.         ELSE IF LOWER(@figura) = 'prostokat'
  248.             BEGIN
  249.                 SET @Wynik = @bok * @bok2;
  250.             END
  251.         ELSE IF LOWER(@figura) = 'kolo'
  252.             BEGIN
  253.                 SET @Wynik = PI()*dbo.potega(@bok);
  254.             END
  255.         ELSE IF LOWER(@figura) = 'trojkat'
  256.             BEGIN
  257.                 SET @Wynik = (@bok * @bok2) / 2;
  258.             END
  259.         ELSE IF LOWER(@figura) = 'romb' OR LOWER(@figura) = 'rownoleglobok'
  260.             BEGIN
  261.                 SET @Wynik = @bok * @bok2;
  262.             END
  263.         RETURN @Wynik;
  264. END;
  265.        
  266. -- split
  267.  
  268. CREATE FUNCTION Split(@string VARCHAR(MAX),@delimiter VARCHAR(5))
  269.     RETURNS @wynik TABLE(tekst VARCHAR(MAX))
  270. AS
  271. BEGIN
  272.     DECLARE @poczatek INTEGER
  273.     DECLARE @koniec INTEGER
  274.    
  275.     SET @poczatek = 1;
  276.     SET @koniec = CHARINDEX(@delimiter, @string);
  277.        
  278.         WHILE @poczatek <= LEN(@string)
  279.             BEGIN
  280.                 IF @koniec = 0
  281.                     SET @koniec = LEN(@string) +1
  282.                        
  283.                 INSERT INTO @wynik(tekst) VALUES
  284.                 (SUBSTRING(@string, @poczatek, @koniec - @poczatek));
  285.                        
  286.                 SET @poczatek = @koniec +1;
  287.                 SET @koniec = CHARINDEX(@delimiter, @string, @poczatek);
  288.             END
  289.  
  290.     RETURN;
  291.  
  292. END;   
  293.    
  294.  
  295. SELECT * FROM dbo.Split('1,2,3,4,5,6',',');
  296.  
  297. */
  298.  
  299. /*
  300.  
  301. Stworz funkcje ktora bedzie przyjmowac 2
  302. argumenty bedace ciagami znakow
  303. maksymalnie do 100 znakow i zwroci
  304. ciag znakow powstaly z wymieszania na
  305. przemian znakow
  306. z ciagu pierwszego z ciagiem drugim
  307. Dodatkowo funkcja to ma zamienic kolejnosc znakow
  308. PRZYKLAD: funkcja('ABCDE','12345') zwroci: 5E4D3C2B1A
  309. W przypadku niezgodosci dlugosci ciagow
  310. wejsciowych wyswietl komunikat typu
  311. 'Blad dlugoci znakow: X <> Y
  312. gdzie X i Y to dlugosci ciagow wejsciowych
  313.  
  314.  
  315.  
  316.  
  317. ALTEr FUNCTION func_awesome(@string_1 VARCHAR(100),@string_2 VARCHAR(100))
  318.     RETURNS VARCHAR(200)
  319. AS
  320.     BEGIN
  321.        
  322.         IF LEN(@string_1) != LEN(@string_2)
  323.             RETURN 'Blad dlugosci znakow: ' + CAST(LEN(@string_1) as VARCHAR) + ' <> ' + CAST(LEN(@string_2) AS VARCHAR)
  324.            
  325.     DECLARE @licznik INT;
  326.     DECLARE @result VARCHAR(200);
  327.    
  328.     SET @licznik = 0;
  329.     SET @result = '';
  330.  
  331.         WHILE(@licznik) <= LEN(@string_1)
  332.             BEGIN
  333.                 SET @licznik = @licznik + 1;
  334.                 set @result = @result + SUBSTRING(@string_1, @licznik-1,1)
  335.                 SET @result = @result + SUBSTRING(@string_2, @licznik-1,1)
  336.             END
  337.  
  338.     RETURN REVERSE(@result);
  339.  
  340. END;           
  341.                                              
  342.  
  343. SELECT dbo.func_awesome('1240', 'qweg');
  344.  
  345.  
  346.  
  347. Dodaj funkcje fun_kol, ktora zwroci tekstowa nazwe
  348. dnia tygodnia powstala z daty powstalej z dodania x dni
  349. (gdzie X to drugi parametr)
  350. do daty podanej w pierwszym parametrze
  351. w przypadku ustawienia null w parametrze X dodaj 10 dni
  352. Przykladowy wynik wyowolania funkcji:
  353. 'Otrzymalismy dzien: Sunday'
  354.  
  355. parameters, data, ilosc dni
  356.  
  357. DATEADD() - zwroci date, 3 argumenty (datepart(year,quarter,monty,doty,week,weekday), nr, data)
  358. DATENAME() - dzisiejsza data
  359. DATE
  360.  
  361.  
  362. CREATE FUNCTION fun_kol(@date datetime, @interwal int)
  363.     RETURNS VARCHAR(50)
  364. AS
  365.  
  366.     BEGIN
  367.         DECLARE @wynik as datetime
  368.         IF @interwal is null
  369.         BEGIN
  370.  
  371.         ....
  372.  
  373.  
  374. --TRIGGER
  375.  
  376. CREATE TRIGGER nazwa
  377. ON nazwa TABELA
  378. FOR AFTER | INSTEAD OF | INSERT | UPDATE | DELETE | CREATE
  379. AS BEGIN
  380.  
  381. END
  382.  
  383.  
  384.  
  385.  
  386. ALTER TRIGGER tr_dzialy on dzialy
  387. FOR INSERT, UPDATE, DELETE
  388. AS
  389. BEGIN
  390.    
  391. SELECT * FROM INSERTED
  392. SELECT * FROM DELETED
  393.  
  394. END;
  395.  
  396. INSERT INTO dzialy(nazwa) VALUES('Nowy')
  397. UPDATE dzialy SET aktualny2 = 'nie'
  398. where nazwa = 'Nowy'
  399.  
  400.  
  401. DELETE FROM dzialy where nazwa = 'Nowy'
  402.  
  403. SELECT * from dzialy
  404.  
  405.  
  406. ALTER TRIGGER tr_dzialy on dzialy
  407. FOR INSERT, UPDATE, DELETE
  408. AS
  409. BEGIN
  410.    
  411.     if update(aktualny)
  412.         print'Zmiana aktualnosci'
  413.     else
  414.         print'Zmiana nie zaszla'
  415.  
  416. print columns_updated() -- pokaze zmiane wartosci
  417.    
  418. END;
  419.  
  420.  
  421. UPDATE dzialy set nazwa = 'nowa nazwa', aktualny = 'tak' where dzialID = 3
  422.  
  423.  
  424. UPDATE dzialy set aktualny2 = 'nie' where dzialID > 5
  425.  
  426. select * from dzialy
  427.  
  428.  
  429.  
  430. select * from zarobki
  431.  
  432. ALTER TRIGGER tr_zarobki on zarobki
  433. INSTEAD OF  DELETE
  434. AS
  435. BEGIN
  436.         update zarobki set aktualny='nie' where zarID in
  437.         (select zarID from deleted)
  438. END;
  439.  
  440. delete from zarobki where  pracID = 1
  441.  
  442.  
  443. -- triggery audytowe
  444.  
  445. -- pola audytowe, info o zmianie danych
  446.  
  447. alter table pracownicy add
  448.    
  449.     data_wst datetime,
  450.     operator_wst varchar(30),
  451.     data_mod datetime,
  452.     operator_mod varchar(30);
  453.  
  454.  
  455.  
  456. select * from pracownicy
  457.  
  458. create trigger tr_prac on pracownicy
  459. for update, insert
  460. as
  461. begin
  462.  
  463. if exists(select * from deleted)
  464.     update pracownicy set data_mod = GETDATE(),
  465.     operator_mod = user
  466.     where pracID in (select pracID from inserted)
  467. else
  468.     update pracownicy set data_wst = GETDATE(),
  469.     operator_wst = user
  470.     where pracID in (select pracid from inserted)
  471. end;
  472.  
  473.  
  474. insert into pracownicy (nazwisko) values ('Naz_Testowe')
  475.  
  476. select * from pracownicy where nazwisko = 'Naz_Testowe'
  477.  
  478. update pracownicy set imie = 'imie_test' where nazwisko = 'Naz_Testowe'
  479.  
  480. select * from pracownicy where nazwisko = 'Naz_Testowe'
  481.  
  482.  
  483.  
  484. tabela o nazwie : zarobki_audyt
  485.  
  486. - id glowny ( auto increment)
  487. - id zarobku (z tabeli zarobki - brak relacji)
  488. - data (zarobki)
  489. - brutto (zarobki)
  490. - id_pracownicy (zarobki - brak relacji)
  491. - operacje
  492. - data operacji
  493.  
  494. Ustawic na kolumnie - operacja - ograniczenie, ktore przyjmuje tylko nazwy INSERT, UPDATE, DELETE
  495.  
  496. Na tabeli - zarobki - utworzyc trigger o nazwie: audyt - ktory wywolywany jest po operacjach wstawienia, aktualizacji i usuwania
  497. Wyzwalacz ten ma wstawiac odpowiedni rekord do tabeli - zarobki_audyt - w zaleznosciod wykonywanej operacji.
  498.  
  499.  
  500. CREATE TABLE [zarobki_audyt]
  501. (
  502.     ID_zarobki_audyt BIGINT NOT NULL IDENTITY(1,1),
  503.     Id_zarobki BIGINT NOT NULL,
  504.     data DATETIME NOT NULL,
  505.     brutto MONEY NOT NULL,
  506.     ID_pracownicy BIGINT NOT NULL,
  507.     operacja VARCHAR(6) NOT NULL,
  508.     data_operacji DATETIME NOT NULL
  509. );
  510.  
  511. ALTER TABLE [zarobki_audyt]
  512. ADD CONSTRAINT [PK_zarobki_audyt] PRIMARY KEY(ID_zarobki_audyt);
  513.  
  514. GO
  515.  
  516. ALTER TABLE [zarobki_audyt]
  517. ADD CONSTRAINT [CHK_operacja] CHECK(UPPER(operacja) = 'INSERT' or UPPER(operacja) = 'DELETE' or UPPER(operacja) = 'UPDATE');
  518.  
  519.  
  520. select * from zarobki_audyt
  521.  
  522.  
  523.  
  524. CREATE TRIGGER audyt on [zarobki]
  525. AFTER insert, update, delete
  526. as
  527. begin
  528.     IF NOT EXISTS (SELECT * FROM [deleted])
  529.        AND EXISTS (SELECT * FROM [inserted])
  530.        BEGIN
  531.         INSERT INTO [zarobki_audyt](ID_zarobki, data, brutto,
  532.                     ID_pracownicy, operacja, data_operacji)
  533.                                     (SELECT ID_zarobki, data, brutto,
  534.                                      ID_pracownicy, 'INSERT', GETDATE()
  535.                                      FROM [inserted]);
  536.         END
  537.     ELSE IF EXISTS (SELECT * FROM [deleted])
  538.        AND NOT EXISTS (SELECT * FROM [inserted])
  539.         BEGIN
  540.         INSERT INTO [zarobki_audyt](ID_zarobki, data, brutto,
  541.                     ID_pracownicy, operacja, data_operacji)
  542.                                     (SELECT ID_zarobki, data, brutto,
  543.                                      ID_pracownicy, 'DELETE', GETDATE()
  544.                                      FROM [deleted]);
  545.  
  546.         END
  547.     ELSE IF EXISTS (SELECT * FROM [deleted])
  548.        AND EXISTS (SELECT * FROM [inserted])
  549.         BEGIN
  550.         INSERT INTO [zarobki_audyt](ID_zarobki, data, brutto,
  551.                     ID_pracownicy, operacja, data_operacji)
  552.                                     (SELECT ID_zarobki, data, brutto,
  553.                                      ID_pracownicy, 'UPDATE', GETDATE()
  554.                                      FROM [deleted]);
  555.  
  556.         END
  557. END;
  558. select * from zarobki_audyt
  559.  
  560.  
  561. INSERT INTO zarobki(data,brutto,ID_pracownicy) VALUES('11/11/11',1000,3)
  562.  
  563. */
  564.  
  565. -- trigger przenoszacy dane dot. zarobkow do tabeli historycznej bedacej dokladna kopia tabeli
  566. -- zarobki bez kolumny aktualny, uwzglednij w tej tabeli date przenosin oraz uzytkownika ktory kasowal dane
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement