background image

 

 

ITA-101 Bazy Danych 

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

Wersja 1.0 

Programowanie zaawansowane  

w T-SQL 

Spis treści 

Programowanie zaawansowane w  T-SQL ........................................................................................... 1 

Informacje o module ........................................................................................................................... 2 

Przygotowanie teoretyczne ................................................................................................................. 3 

Przykładowy problem ................................................................................................................. 3 

Podstawy teoretyczne ................................................................................................................. 3 

Przykładowe rozwiązanie ............................................................................................................ 6 

Porady praktyczne ...................................................................................................................... 7 

Uwagi dla studenta ..................................................................................................................... 7 

Dodatkowe źródła informacji ...................................................................................................... 8 

Laboratorium podstawowe ................................................................................................................. 9 

Problem 1 (czas realizacji 30 minut) ............................................................................................ 9 

Problem 2 (czas realizacji 15 minut) .......................................................................................... 11 

Laboratorium rozszerzone ................................................................................................................ 13 

Zadanie 1 (czas realizacji 90 min) .............................................................................................. 13 

 

 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 2/13 

Informacje o module 

Opis modułu 

Programowanie  w  języku  zapytao  to  ważna  umiejętnośd.  Powinni  ją 
opanowad zarówno programiści, jak i administratorzy. Różne dialekty języka 
SQL  oferują  różne  składnie,  jednak  reguły,  jakimi  powinien  kierowad  się 
tworzący kod, są te same niezależnie od SZBD. Bardzo często opanowanie w 
zaawansowanym  stopniu  składni  jednego  języka  pozwala  w  przyszłości  na 
łatwe opanowanie innego.  W module tym znajdziesz informację na temat 
zaawansowanego programowania w T-SQL. 

Cel modułu 

Celem  modułu  jest  zapoznanie  czytelnika  z  zaawansowanymi  elementami 
języka T-SQL, takimi jak instrukcje sterujące, kursory, obsługa błędów itp. 

Uzyskane kompetencje  

Po zrealizowaniu modułu będziesz: 

 

potrafił użyd instrukcji sterujących w języku T-SQL 

 

rozumiał sposób działania i funkcjonowania kursorów 

 

wiedział, w jaki sposób działa obsługa błędów 

Wymagania wstępne 

Przed przystąpieniem do pracy z tym modułem powinieneś: 

 

potrafid  stworzyd  bazę  danych  wraz  z  jej  podstawowymi  obiektami 
(patrz Moduł 4) 

 

potrafid  napisad  podstawowe  instrukcje  w  języku  T-SQL  DCL  i  T-SQL 
DDL (patrz Moduł 6) 

 

potrafid pisad zapytania w języku T-SQL DML (patrz Moduł 7)  

 

rozumied podstawową składnię języka T-SQL 

Mapa zależności modułu 

Zgodnie  z  mapą  zależności  przedstawioną  na  Rys.  1,  przed  przystąpieniem 
do  realizacji  tego  modułu  należy  zapoznad  się  z  materiałem  zawartym 
w Module 3, Module 5 i Module 6. 

Moduł 8

Dodatek

Moduł 1

Moduł 2

Moduł 3

Moduł 4

Moduł 5

Moduł 6

Moduł 7

Moduł 9

Moduł 10

Moduł 11

Moduł 12

Moduł 13

 

Rys. 1 Mapa zależności modułu 

 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 3/13 

Przygotowanie teoretyczne 

Przykładowy problem 

Podczas  wytwarzania  bazy  danych  wiąże  ze  sobą  grupę  osób  do  której  należą  projektant  bazy 
danych,  administrator  systemu  zarządzania  bazą  danych,  administrator  bazy  danych  oraz 
programista bazy danych. Bardzo ważne jest żeby wszyscy biorący udział w wytwarzaniu systemu 
bazodanowego współdziałali ze sobą na różnych etapach. Najwięcej wspólnego z programowaniem 
w  T-SQL  ma  programista  bazy  danych.  To  od  niego  w  dużej  mierze  zależy  czy  wytworzone  przez 
niego funkcje, procedury składowane, wyzwalacze i inne element programistyczne będą działały we 
właściwy  sposób.  To  on  odpowiedzialny  jest  za  przygotowanie  odpowiednich  elementów 
programowych,  które  następnie  będzie  wykorzystywał  projektant  aplikacji  i  programista  aplikacji 
dostępowej.  A  zatem  również  od  niego  w  pewnym  stopniu  zależy  bezpieczeostwo  danych 
gromadzonych  w  bazie.  Zatem  powinien  on  dysponowad  odpowiednią  wiedzą  i  posiadad  pewne 
umiejętności  z  zakresu  zaawansowanego  programowania  w  języku  T-SQL.  Zatem  znajomośd  tego 
języka oraz dobre nawyki wynikające z praktyki programowania są bardzo ważne. Podstawowymi 
składowymi języka T-SQL są instrukcje sterujące, kursory i obsługa błędów. 

Podstawy teoretyczne 

Język  T-SQL  stale  ewoluuje.  Właściwie  z  języka  zapytao  stał  się  językiem  programowania  baz 
danych.  Programiści  tworzący  oprogramowanie  mogą  łatwo  nauczyd  się  języka  T-SQL  dzięki 
istniejącym analogiom do tradycyjnych języków programowania proceduralnego. Jednymi z częściej 
używanych konstrukcji są instrukcje sterujące. 

Instrukcje sterujące 
Instrukcja  sterująca 

IF...ELSE

  daje  możliwośd  warunkowego  wykonywania  bloków  kodu.  W 

implementacji T-SQL wygląda ona jak poniżej: 

IF warunek_logiczny 

{  wyrażenie_sql | wyrażenie_blokowe   } 

ELSE 

{  wyrażenie_sql | wyrażenie_blokowe   } 

 

Należy zwrócid uwagę, że jeśli blok po słowie IF lub ELSE składa się z wielu linii kodu, musisz użyd 
właśnie składni 

BEGIN...END

. Wówczas: 

IF warunek_logiczny 

BEGIN 

wyrażenie_sql | wyrażenie_blokowe 

  END 

ELSE 

  BEGIN 

wyrażenie_sql | wyrażenie_blokowe 

  END 

Poniższy kod przedstawia przykładowe użycie instrukcji sterującej 

IF...ELSE.

 

 
IF @zmienna > 100 
  PRINT 'Zmienna jest większa niż 100' 
ELSE 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 4/13 

BEGIN 
  PRINT 'Zmienna jest mniejsza niż 100' 
  SET @zmienna = 0 -- zerowanie zmiennej 
END 

 

Kolejna instrukcja sterująca to pętla 

WHILE

. W T-SQL wygląda ona następująco: 

WHILE wyrażenie_logiczne 

{    wyrażenie_sql | wyrażenie_blokowe     } 

[BREAK] 

{    wyrażenie_sql | wyrażenie_blokowe     } 

[CONTINUE] 

{    wyrażenie_sql | wyrażenie_blokowe     } 

Wyrażenie logiczne zwraca wartośd TRUE lub FALSE. Podobnie jak w przypadku instrukcji sterującej 

IF...ELSE 

jeśli  wyrażenie  SQL  składa  się  z  wielu  linii  kodu,  musisz  użyd  właśnie  składni 

BEGIN...END

. W instrukcji WHILE występują dwa istotne argumenty: 

 

BREAKE

 powoduje wyjście z pętli WHILE.  

 

CONTINUE 

powoduje ponowne uruchomienie instrukcji

 WHILE

 

Poniższy kod przedstawia przykładowe użycie instrukcji sterującej 

WHILE.

 

DECLARE @zmienna int 
SET @zmienna = 0 
 
WHILE @zmienna < 10 
BEGIN 
  PRINT 'Iteracja nr ' + CAST(@zmienna AS varchar(2)) 
  SET @zmienna = @zmienna + 1 
END 

Należy  pamiętad,  że  pętla  WHILE  może  byd  wykonywana  w  nieskooczonośd,  jeśli  programista  nie 
zapewni wyjścia z pętli. 

Kursory 
Kursor  to  obiekt,  który  umożliwia  poruszanie  się  po  wynikach  zapytania  rekord  po  rekordzie. 
Umożliwia  on  przetwarzanie  rekordów  jeden  po  drugim  co  daje  możliwośd  zaawansowanego 
formatowania  wyników wyszukiwania danych  (ale  w  ściśle  określonej kolejności, determinowanej 
przez wynik zapytania użytego w definicji kursora)  

Implementacja kursora w języku T-SQL wygląda następująco: 

DECLARE nazwa_kursora CURSOR [ LOCAL | GLOBAL ]  

[ FORWARD_ONLY | SCROLL ]  
     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]  
     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]  
     [ TYPE_WARNING ]  
     FOR wyrażenie_select 
     [ FOR UPDATE [ OF nazwa_kolumny [ ,...n ] ] ] 
[;] 

Poniższy kod przedstawia przykładowe użycie kursora

.

 

DECLARE Employee_Cursor CURSOR FOR 
SELECT LastName, FirstName 
FROM Northwind.dbo.Employees 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 5/13 

WHERE LastName like 'B%' 
 
OPEN Employee_Cursor 
 
FETCH NEXT FROM Employee_Cursor 
WHILE @@FETCH_STATUS = 0 
BEGIN 
  FETCH NEXT FROM Employee_Cursor 
END 
 
CLOSE Employee_Cursor 
DEALLOCATE Employee_Cursor 

Składnia specjalna 
Nowoczesne  języki  SQL  obfitują  w  specjalne  składnie,  które  znacznie  rozszerzają  funkcjonalnośd. 
Przykładem  takiej  składni  może  byd 

PIVOT

.  Składnia  ta  umożliwia  stworzenie  tabeli  wynikowej  z 

zapytania 

SELECT

,  w  której  w  nagłówkach  wierszy  i  kolumn  znajdują  się  wartości  z  tabel 

źródłowych.  

 

USE AdventureWorks 
GO 
SELECT VendorID, [164] AS Emp1, [198] AS Emp2, [223] AS Emp3, [231] AS 
Emp4, [233] AS Emp5 
FROM  
(SELECT PurchaseOrderID, EmployeeID, VendorID 
FROM Purchasing.PurchaseOrderHeader) p 
PIVOT 

COUNT (PurchaseOrderID) 
FOR EmployeeID IN 
( [164], [198], [223], [231], [233] ) 
) AS pvt 
ORDER BY VendorID; 

Przykładowy wynik: 

VendorID    Emp1        Emp2        Emp3        Emp4        Emp5 

1           4           3           5           4           4 

2           4           1           5           5           5 

3           4           3           5           4           4 

4           4           2           5           5           4 

5           5           1           5           5           5 

Powyższy  wynik  obrazuje  możliwości  tej  składni  umożliwiając  zbudowanie  tabeli  wyświetlającej 
ilośd  zamówieo  u  wybranych  producentów,  dokonanych  przez  pięciu  pracowników  (każdy 
pracownik o określonym EmployeeID). 

Obsługa błędów 
W trakcie działania kodu SQL mogą wydarzyd się nieprzewidziane błędy. Błędy te mogą wynikad z 
różnych przyczyn. Mogą to byd błędy wynikające z narzuconych w bazie danych ograniczeo lub na 
przykład  błędy  wynikające  z  prób  wykonania  niedozwolonych  operacji.  Wykrycie  tych  błędów  i 
odpowiednia na nie reakcja to zadanie dla programisty baz danych. 

Błędy wykrywamy najczęściej w: 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 6/13 

 

transakcjach – po wykryciu błędu wycofujemy transakcję 

 

procedurach składowanych – wykrywamy błędy powstałe głównie w wyniku niepoprawnych 
wartości parametrów podanych przez użytkownika 

 

wyzwalaczach  –  podobnie  jak  w  transakcjach,  po  napotkaniu  błędu  wycofywana  jest 
transakcja wywołująca trigger 

 

blokach kodu SQL – wszelkie rozbudowane bloki kodu wymagają wykrywania błędów 

Metod  pozwalających na wykrycie błędów  jest  wiele.  Można zastosowad instrukcje sterujące, np. 

IF...ELSE

, do sprawdzania wartości zmiennych, by w ten sposób zapobiegad wystąpieniu błędów. 

Druga  metoda  to  wykorzystanie  istniejących  w  Systemie  Zarządzania  Bazą  Danych  funkcji 
wykrywających  błędy.  W  systemie  Microsoft  SQL  Server  taką  funkcją  jest 

@@ERROR

,  która  zwraca 

numer ostatnio napotkanego błędu w bieżącej sesji. 

Aktualnie istnieją także inne, można by rzec lepsze metody wykrywania i obsługi błędów. Chodzi o 
strukturalną  obsługę  wyjątków.  Jako  wyjątek  rozumiemy  błąd,  który  wymaga  obsługi.  Poniżej 
pokazano składnię 

TRY...CATCH

 (ang. try – próbuj, catch – przechwyd).   

BEGINE TRY 

  {    wyrażenie_sql | wyrażenie_blokowe     } 

END TRY 

BEGIN CATCH 

{    wyrażenie_sql | wyrażenie_blokowe     } 

END CATCH 

jeśli  wyrażenie  SQL  składa  się  z  wielu  linii  kodu,  podobnie  jak  w  przypadku  instrukcji  sterujących 

IF…ELSE

 i 

WHILE

 musisz użyd składni 

BEGIN...END

Przykładowe rozwiązanie 

Przykładowe użycie instrukcji sterującej 
Rozważmy  przykład  w  którym  średnia  cena  produktu  jest  mniejsza  od  100  zł.  Jeżeli  maksymalna 
cena jest większa od 300 zł wówczas pętla 

WHILE

 kasuje tą wartośd a następnie podwaja ją. Pętla ta 

wykonuje  się  do  momentu  aż  maksymalna  cena  jest  większa  od  300  zł.  Po  spełnieniu  warunku 
wychodzimy z pętli i wyświetlamy komunikat. 

USE AdventureWorks; 

GO 

WHILE (SELECT AVG(ListPrice) FROM Production.Product) < 100 

BEGIN 

   UPDATE Production.Product 

      SET ListPrice = ListPrice * 2 

   SELECT MAX(ListPrice) FROM Production.Product 

   IF (SELECT MAX(ListPrice) FROM Production.Product) > 300 

      BREAK 

   ELSE 

      CONTINUE 

END 

PRINT 'Wyświetlony komunikat po wyjściu z pętli'; 

 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 7/13 

Przykładowe użycie TRY…CATCH 
Poniższy  fragment  kodu  obrazuje  przykładową  obsługę  wyjątków  przy  pomocy  składni 

TRY...CATCH

  .  W  celu  pokazania  obsługi  błędów  dokonujemy  dzielenia  przez  zero,  które  jest 

niewykonalny.  Wówczas 

TRY

  zwraca  wyjątek,  który  jest  przechwytywany  przez 

CATCH

.  W  bloku 

CATCH

  po  przechwyceniu  wyjątku,  wyświetlany  jest  odpowiedni  komunikat  zdefiniowany  prze 

programiste. 

BEGIN TRY 
  -- generujemy błąd 
  SELECT 1/0; 
END TRY 
 
BEGIN CATCH 
  -- obsługujemy błąd 
  RAISERROR('Nie dzielimy przez zero',16,1) 
END CATCH; 

 

Porady praktyczne 

 

Funkcja wykrywania błędów 

@@error

 zwraca: 

o   wartośd 

0

 jeżeli nie napotka błędu w wyniku wykonania wyrażenie T-SQL. 

o  Numer błędu jeżeli napotka błąd w wyniku wykonania wyrażenia T-SQL. 

Na  poniższym  przykładzie  pokazano  użycie  funkcji 

@@error

  do  sprawdzenia  naruszenia 

ograniczenia, które może dojśd w sytuacji modyfikacji danych. 

UPDATE EmployeePayHistory 

SET PayFrequency = 4 
WHERE EmployeeID = 1; 

IF @@ERROR = 547 

PRINT 'naruszone ograniczenie.'; 

GO 

 

Informacje na temat błędu mogą byd uzyskiwane przy użyciu funkcji 

ERROR_NUMBER

 (numer 

błędu) i 

ERROR_MESSAGE

 (komunikat błędu). 

 

SQL  Server  udostępnia  trzy  rodzaje  programowalnych  obiektów:  funkcje,  procedury 
składowane i wyzwalacze. W celu poprawnego pisania elementów programowalnych należy 
znad zaawansowane  elementy  języka  T-SQL.  Zamiast  wykonywania  pojedynczego  polecenia 
lub  komendy,  obiekty  te  umożliwiają  tworzenie  bogatej  logiki  programistycznej,  które 
zawierają pętle, kontrole przepływu, podejmowania decyzji i rozwidlenia. 

 

Zdolnośd do uruchamiania transakcji i przeznaczenie ich do pozostawienia lub wycofania nie 
wystarczy  do  efektywnego  radzenia  sobie  z  problemem.  W  tym  przypadku  niezbędnym 
składnikiem jest zdolnośd do programowanego wykrywania i obsłużenia błędów. 

 

Wewnątrz  bloku 

CATCH

  możemy  ustalid  co  spowodowało  błąd  i  przekazad  informacje  o 

błędzie  użynając  systemu  obsługi  błędów  języka  T-SQL.  Najczęściej  używanymi  takimi 
funkcjami są 

ERROR_NUMBER

 i 

ERROR_MESSAGE

. Zwracają one numer błędu i tekst opisu błędu.  

 

Używając  funkcji 

ERROR_NUMBER

  i 

ERROR_MESSAGE

  w  bloku  instrukcji 

CATCH

  możemy 

zdecydowad, czy potrzeba użyd 

ROLLBACK

 do cofnięcia naszej transakcji. 

Uwagi dla studenta 

Jesteś przygotowany do realizacji laboratorium jeśli: 

 

rozumiesz, co oznacza instrukcja sterująca 

 

rozumiesz zasadę działania kursorów 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 8/13 

 

umiesz zdefiniowad prostą pętlę 

 

umiesz podad przykład obsługi błędów 

Pamiętaj  o  zapoznaniu  się  z  uwagami  i  poradami  zawartymi  w  tym  module.  Upewnij  się,  że 
rozumiesz omawiane w nich zagadnienia. Jeśli masz trudności ze zrozumieniem tematu zawartego 
w uwagach, przeczytaj ponownie informacje z tego rozdziału i zajrzyj do notatek z wykładów. 

Dodatkowe źródła informacji 

1.  Kalen  Delaney,  Microsoft  SQL  Server  2005:  Rozwiązania  praktyczne  krok  po  kroku,  Microsoft 

Press, 2006  

W  książce  autor  w  przystępny  i  zrozumiały  sposób  przedstawia  podstawowe 
mechanizmy  zaawansowanego  programowania  w  języku  T-SQL.  Książka  polecana 
szczególnie dla osób początkujących. 

2.  Edward Whalen, Microsoft SQL Server 2005 Administrator’s Companion, Microsoft Press, 2006  

W  książce  autor  pokazał  zaawansowane  mechanizmy  projektowania  w  języku  T-
SQL, które mogą zostad wykorzystane do programowania  w bazach danych takich 
obiektów  jak  funkcje,  procedury  składowane,  wyzwalacze  i  transakcje.  Pozycja 
szczególnie  polecana  dla  osób  chcących  poszerzyd  swoją  wiedze  na  temat 
programowania baz danych. 

3.  Deren  Bieniek,  Randy  Dyess,  Mike  Hotek,  Javier  Loria,  Adam  Machanic,  Antonio  Soto,  Adolfo 

Wiernik, SQL Server 2005 Implemantacja i obsuga, APN Promise, Warsyawa 2006 

W  książce  tej  podobnie  jak  w  powyższej  pozycji  przedstawiono  elementy 
zaawansowanego  programowania  w  języku  T-SQL.  Pokazano  praktyczne 
zastosowanie  zaawansowanych  mechanizmów  T-SQL.  Książka  polecana  dla  osób 
początkujących jak również chcących poszerzyd swoją wiedzę. 

 

 

 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 9/13 

Laboratorium podstawowe 

Problem 1 (czas realizacji 30 minut) 

Jesteś administratorem w firmie National Insurance. Właśnie dowiedziałeś się od swojego szefa, że 
firma  National  Insurance  zarządzająca  systemem  prac  dyplomowych  na  twoim  wydziale  planuje 
rozszerzenie  systemu  na  skalę  uczelnianą.  Zadanie,  jakie  przed  Tobą  stoi,  to  stworzenie 
zaawansowanego mechanizmu wybierania danych z twojej bazie danych oraz przedstawienie tych 
danych w odpowiedniej formie. 

 

Zadanie 

Tok postępowania 

1.  Nawiązywanie 
połączenia z SQL 
Server 2008 

 

Uruchom maszynę wirtualną BD2008

—  Jako nazwę użytkownika podaj Administrator
—  Jako hasło podaj P@ssw0rd

Jeśli  nie  masz  zdefiniowanej  maszyny  wirtualnej  w  MS  Virtual  PC, 
dodaj  nową  maszynę  używając  wirtualnego  dysku  twardego  z  pliku 
D:\VirtualPC\Dydaktyka\BD2008.vhd

 

Kliknij  Start.  Z  grupy  programów  Microsoft  SQL  Server  2008  uruchom 
SQL Server Management Studio

 

W oknie logowania kliknij Connect

2.  Instrukcja 
sterująca CASE 

 

Z menu głównego wybierz File -> Open -> File

 

Odszukaj pliku C:\Labs\Lab06\Case.sql. 

 

Zaznacz  i  uruchom  kod  ze  skryptu  Case.sql.  Wynik  działania  pokazano 
na Rys. 2. 

USE PraceDyplomowe 
GO 
SELECT  
  C.Nazwisko, C.Imie, 
  CASE 
    WHEN E.ID_Ocena = '2' THEN 'trzy' 
    ELSE 'inna' 
  END AS Gender 
FROM Ocena E 
INNER JOIN Osoba C 
ON E.ID_Ocena = C.ID_Osoby 
GO 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 10/13 

 

Rys. 2 Wynik działania skryptu z użyciem instrukcji CASE 

3.  Stronicowanie 
danych 

 

Z menu głównego wybierz File -> Open -> File

 

Odszukaj pliku C:\Labs\Lab06\Stronicowanie.sql 

 

Zaznacz  i  uruchom  kod  ze  skryptu  Stronicowanie.sql.  Wynik  działania 
pokazano na Rys. 3. 

USE PraceDyplomowe 
GO 
SELECT T.Nazwisko 
  FROM ( 
    SELECT  
      Nazwisko,  
      ROW_NUMBER() OVER(ORDER BY ID_Stopnian) AS Pozytywna 
    FROM Osoba 
  ) AS T 
WHERE T.Pozytywna BETWEEN 2 AND 6 
GO 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 11/13 

 

Rys. 3 Wynik stronicowania danych 

Powyższe  zapytanie  stanowi  rozwiązanie  problemu  stronicowania 
danych. W tym wypadku wynikiem jest lista osób z tabeli Osoby, przy 
czym  wyświetlone  zostają  nazwiska  osób,  które  z  pracy  otrzymały 
ocenę pomiędzy 3 a 5, biorąc pod uwagę sortowanie według kolumny 
ID_Stopnian
Zapytanie zadziała tak samo, nawet gdy numeracja w tej kolumnie nie 
będzie ciągła. Wykorzystuje ono podzapytanie, w którym dla każdego 
wiersza  generowana  jest  liczba  porządkowa  za  pomocą  funkcji 
ROW_NUMBER  (funkcja  ta  musi  przed  generowaniem  wartości 
określid kryterium sortowania, stąd klauzula ORDER BY). 

Problem 2 (czas realizacji 15 minut) 

Kolejne zadanie jakie związane jest z rozbudową systemu prac dyplomowych jakie przed Tobą stoi 
to  oprogramowanie  obsługi  błędów  (przechwytywanie  i  obsługa)  z  użyciem  zaawansowanych 
mechanizmów jakimi dysponuje SQL Server.  

 

Zadanie 

Tok postępowania 

1.  Nawiązywanie 
połączenia z SQL 
Server 2008 

 

Uruchom maszynę wirtualną BD2008

—  Jako nazwę użytkownika podaj Administrator
—  Jako hasło podaj P@ssw0rd

Jeśli  nie  masz  zdefiniowanej  maszyny  wirtualnej  w  MS  Virtual  PC, 
dodaj  nową  maszynę  używając  wirtualnego  dysku  twardego  z  pliku 
D:\VirtualPC\Dydaktyka\BD2008.vhd

 

Kliknij  Start.  Z  grupy  programów  Microsoft  SQL  Server  2008  uruchom 
SQL Server Management Studio

 

W oknie logowania kliknij Connect

2.  Tworzenie 
tabeli archiwizacji 
błędów 

 

Z menu głównego wybierz File -> Open -> File

 

Odszukaj pliku C:\Labs\Lab09\Errors.sql 

 

Zaznacz  i  uruchom  kod  ze  skryptu  Errors.sql,  który  tworzy  tabele,  w 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 12/13 

której będą zapisywane informacje o błędach. Wynik działania pokazano 
na Rys. 2. 

-- (1) Ustawiamy się na baze danych PraceDyplomowe 

USE PraceDyplomowe 
GO 

-- (2) Tworzymy tabele w ktorej bedzie przechowywana informacja o 
-- bledach 

CREATE TABLE TabelaBledow 

  ErrorID int IDENTITY(1,1) PRIMARY KEY, 
  ErrorNumber int NOT NULL, 
  ErrorMessage nvarchar(200) NOT NULL, 
  ErrorDate datetime DEFAULT GETDATE() 

GO 

Powyższy  kod  tworzy  tabelę  TabelaBledow,  która  będzie  zawierała 
informacje  o  występujących  błędach.  W  kolumnie  ErrorNumber 
zapisany  zostanie  numer  błędu,  w  kolumnie  ErrorMessage  – 
komunikat  błędu,  zaś  w  kolumnie  ErrorDate  –  data  i  godzina 
wystąpienia  błędu  (wartośd  domyślna  –  bieżąca  data  i  czas  –  jest 
generowana przy pomocy funkcji systemowej GETDATE). 

3.  Przechwytywa
nie błędów 

 

Zaznacz i uruchom (F5) poniższy fragment kodu: 

-- (3) Implementacja obslugi przechwytywania bledow 

BEGIN TRY 
  SELECT 1/0 
END TRY 
BEGIN CATCH 
  INSERT TabelaBledow(ErrorNumber, ErrorMessage) 
  SELECT  ERROR_NUMBER(), ERROR_MESSAGE() 
END CATCH 
GO 

4.  Przeglądanie 
informacji o 
wystąpieniu błędu 

 

Zaznacz i uruchom (F5) poniższy fragment kodu: 

-- (4) Wyswietlenie zawartosci tabeli bledow  

SELECT * FROM TabelaBledow 
GO 

Wynik działania pokazano na Rysunku 4. 

 

Rys. 4 Informacja o błędzie 

 

 

 

background image

Włodzimierz Dąbrowski, Przemysław Kowalczuk, Konrad Markowski 

Moduł 8 

ITA-101 Bazy danych 

 

Programowanie zaawansowane w T-SQL 

Strona 13/13 

Laboratorium rozszerzone 

Zadanie 1 (czas realizacji 90 min) 

Jesteś administratorem w firmie National Insurance. Właśnie dowiedziałeś się od swojego szefa, że 
firma  zarządzająca  bazą  AdventureWorks  planuje  rozszerzenie  i  modernizacje  systemu  w  celu 
spełnienia  pewnych  standardów.  W  związku  z  modernizacją  systemu  bazodanowego 
najprawdopodobniej  ulegną  zmianie  pewne    metody  wybierania  danych.  Wydaje  się  zasadne 
stworzenie  bardziej  wyrafinowanych  metod  wybierania  danych  w  oparciu  o  zaawansowane 
konstrukcje  języka  T-SQL.  Prawdopodobnie  również  w  związku  z  wejściem  na  wyższy  poziom 
programowania w T-SQL będziesz musiał wprowadzid strukturalną obsługę błędów. 

Zadanie, jakie przed Toba stoi, to: 

1.  Podjęcie  decyzji,  które  zapytania  w  bazie  danych  pozostaną  bez  zmian,  które  stare  proste 

zapytania  zostaną  zmodyfikowane  i  zastąpione  czymś  bardziej  złożonym  wykorzystując 
zaawansowane możliwości języka T-SQL, a które będą musiały zostad całkowicie usunięte. 

2.  Zaplanowanie struktury obsługi błędów dla zapytao istniejących w systemie bazodanowym?