Archiwum kategorii: T-SQL

T-SQL SQL Server / Funkcja CHARINDEX

Za pomocą funkcji CHARINDEX możemy sprawdzić czy dany łańcuch znaków zawiera jakiś poszukiwany przez nas ciąg znaków. Naszym poszukiwanym ciągiem będzie jakiś tekst. Funkcja ta zwróci nam pozycję pierwszego znaku poszukiwanego tekstu z pierwszego wystąpienia naszego poszukiwanego tekstu. Funkcja CHARINDEX() jest bardzo podobna w działaniu do funkcji PATINDEX(). Różnica między tymi funkcjami polega na tym, że zdefiniowany wzorzec (poszukiwany tekst) w funkcji CHARINDEX() nie może zawierać znaków wieloznacznych a wzorzec w funkcji PATINDEX() może zawierać takie znaki.

Przykład zastosowania funkcji CHARINDEX

Sprawdź czy w zdaniu 'Ala ma kota' znajduje się tekst 'kot' i zwróć pozycję od której zaczyna się ten tekst w zdaniu.

— Dekarujemy sobie łańcuch główny, czyli zdanie 'Ala ma kota'
DECLARE
    @zdanie NVARCHAR(11) = 'Ala ma kota'

SELECT
     CHARINDEX('kot' , @zdanie) as [Pozycja pierwszego wystąpienia ‚kot’]

wynik

Pozycja pierwszego wystąpienia 'kot'

8

dla funkcji CHARINDEX() wielkość znaków w tekście nie ma znaczenia poniżej przykład

DECLARE
    @zdanie NVARCHAR(11) = 'Ala ma kota'

SELECT
     CHARINDEX('KoT' , @zdanie) as [Pozycja pierwszego wystapienia ‚kot’]

Zwróć uwagę, że kot w zdaniu 'Ala ma kota' jest pisany małymi literami, a w funkcji CHARINDEX() chcemy znaleźć ciąg KoT, gdzie K i T pisane są dużymi literami.

wynik

Pozycja pierwszego wystąpienia 'kot'

8

Widzimy więc, że wielkość liter w szukanym wzorcu nie ma znaczenia.


  SQL tutorial. AdventureWorks exercises SQL SERVER

T-SQL SQL Server / Funkcja PATINDEX

Za pomocą funkcji PATINDEX możemy sprawdzić czy dany łańcuch znaków zawiera jakiś poszukiwany przez nas ciąg znaków. Naszym poszukiwanym ciągiem może być konkretny text lub wzorzec utworzony z symboli wieloznacznych np. wyrażony w postaci wyrażenia regularnego. Funkcja ta zwróci nam pozycję pierwszego znaku poszukiwanego tekstu (który może być także wzorcem) z pierwszego wystąpienia poszukiwanego ciągu znaków (lub ciągu który pasuje do zdefiniowanego wzorca). Funkcja PATINDEX() jest bardzo podobna w działaniu do funkcji CHARINDEX(). Różnica między tymi funkcjami polega na tym, że zdefiniowany wzorzec (poszukiwany tekst) w funkcji PATINDEX() może zawierać znakie wieloznaczne a w funkcji CHARINDEX() nie.

Przykład zastosowania funkcji PATINDEX

Sprawdź czy w ciągu znaków 'Pierwszy dokument ma numer PL1020304050, a drugi dokument ma postać PL6050403020' znajduje się podciąg znaków który jest zbudowany wg wzoru: dwie duże litery od A-Z + 10 cyfr i zwróć pozycję od której zaczyna się poszukiwany ciąg znaków w ciągu głownym oraz wytnij ten kawałek tekstu z łańcucha głównego.

— Dekarujemy sobie łańcuch główny
DECLARE
    @lancuch_glowny NVARCHAR(100) = 'Pierwszy dokument ma numer PL1020304050, a drugi dokument ma postać PL6050403020'

SELECT
     PATINDEX('%[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%' , @lancuch_glowny) as [Pozycja pierwszego wystapienia lancucha]
    ,SUBSTRING(@lancuch_glowny , PATINDEX('%[A-Z][A-Z][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%' , @lancuch_glowny),12) as [Skopiowany lancuch]


  SQL tutorial. AdventureWorks exercises SQL SERVER

T-SQL SQL Server Wyzwalacze (ang. Triggers)

Wyzwalacze (ang. Triggers) są specjalnymi rodzajami procedur składowanych, które uruchamiają się automatycznie w wyniku zaistnienia jakiegoś zdarzenia na serwerze bazy danych. Wyzwalacze mogą służyć do różnych rzeczy np. obsługi błędów, sprawdzania poprawności danych, modyfikacji widoków itp.

W SQL Server rozróżniamy kilka typów wyzwalaczy w zależności od zdarzenia.

  • Wyzwalacze DML (od Data Manipulating Language) – chodzi tutaj o polecenia dzięki którym „manipulujemy”/zarządzamy danymi INSERT, UPDATE i DELETE. Wyzwalacze tego typu możemy zastosować na tabeli lub na widoku.
  • Wyzwalacze DDL (od Data Definiton Language) – tutaj chodzi o polecenia które służą do definiowania struktury danych CREATE, ALTER, DROP.
  • Wyzwalacze Logon – (istnieją na pewno od wersji SQL Server 2012) tutaj mamy do czynienia ze zdarzeniami Logon, kiedy użytkownik nawiązuje połączenie (sesje) z bazą danych.

Wyzwalacze rozróżniamy także w zależności od typu. W niniejszym wpisie skupimu się na Before i After:

  • Befor – trigger zostanie uruchomiony przed zdarzeniem
  • After – trigger zostanie uruchomiony po zdarzeniu

Przykład definicji prostego Triggera

Do czego służą wyzwalacze

Triggery możemy wykorzystać do bardzo wielu rzeczy, oto kilka z ich zastosowań:

  • wyzwalacze bardzo często wykorzystujemy do definiowania warunków integralności danych w tabelach
  • do kaskadowego wykonania pewnych operacji
  • są również wykorzystywane do kontroli danych
  • mogą służyć także do implementacji złożonych reguł biznesowych
  • możemy je także wykorzystać od generowania określonych wartości w tabelach
  • itp.

Przykład zastosowania Triggera na bazie AdventureWorks2008R2

Stwórzmy najprostszy Trigger jaki chyba tylko można stworzyć. Przy próbie modyfikacji danych w tabeli Person.Person za pomocą poleceń INSERT, UPDATE, DELETE ma się uruchomić trigger o nazwie TriggerInfo który wyświetli tylko komunikat „Brawo Twój pierwszy Trigger zadziałał”.

 Zgodnie z przykładową strukturą Triggera powyżej utworzyłem kod który utworzy nasz Trigger na tabeli Person.Person.

Teraz uruchamiamy nasz kod klawiszem F5 lub klikamy na przycisk „EXECUTE” !!! PAMIĘTAJ !!! że musisz być ustawiony w odpowiednim kontekście, czyli w bazie AdventureWorks2008R2. Jeżeli wszystko przebiegnie poprawnie powinniśmy uzyskać komunikat „Command(s) completed successfully”. Już w tym momencie w gałęzi Databases -> AdventureWorks2008R2 -> Tables  -> Person.Person  -> Triggers , powinien pojawić się nowy Trigger o nazwie TriggerInfo. Jeżeli go nie ma musimy kliknąć prawym przyciskiem myszy na gałęzi Triggers i z menu kontekstowego wybrać opcję Refresh.

t-sql sql server wyzwalacze triggers

Teraz sprawdzimy czy nasz trigger działa. W tym celu zmodyfikujemy jeden rekord w tabeli Person.Person i zobaczymy czy nasz trigger się uruchomi. Pamiętasz, że nasz trigger powiniem się uruchomić w przypadku zastosowania na tabeli Person.Person którejś z instrukcji INSERT, UPDATE, DELETE. My zastosujemy instrukcję UPDATE i zmodyfikujemy wiersz z osobą Ken Sanchez.

Poniżej zrzut tabeli sprzed modyfikacji.

t-sql sql server wyzwalacze triggers

Poniżej instrukcja UPDATE którą zmodyfikujemy imię z Ken na KEN, czyli zmienimy tylko rozmiar liter.

Wykonyjemy nasz kod F5 i jeżeli wszystko poszło poprawnie powinniśmy otrzymać dwa komunikaty. Jeden o tym, że zmodyfikowaliśmy jeden wiersz

(1 row(s) affected)

A drugi komunikat z naszego Triggera.

Brawo Twój pierwszy Trigger zadzialal

Co obrazuje poniższy zrzut.

t-sql sql server wyzwalacze triggers

Mamy więc pewność, że nasz Trigger działa poprawnie.

Zapraszam do kolejnych wpisów na Anonco.PL


  SQL tutorial. AdventureWorks exercises SQL SERVER

T-SQL SQL Server Procedury składowane (Stored Procedures)

Dzisiaj zajmiemy się tematem procedury składowane, w literaturze niekiedy nazywane osadzonymi. Najprostsza definicja jaka przychodzi mi do głowy to taka, że procedury składowane to zbiór instrukcji SQL, które zapisujemy pod jedną nazwą. Następnie możemy odwołać się do danej procedury (wywołać ją) za pomocą tej nazwy wraz z parametrami wejściowymi które wcześniej definiujemy w procedurze. Struktura procedury składowanej (najprostsza jaką znalazłem) poniżej.

Definicja procedury składowanej (najprostszej jaką znalazłem).

ale np. przy próbie utworzenia nowej procedury składowanej w SQL Server otrzymamy automatycznie kod (bez kometarzy).

 

Przykład

Utwórz procedurę która będzie pobierała dwa parametry Imię , Nazwisko i w zależności od tych parametrów będzie podawała dane teleadresowa danej osoby: Adres, E-mail, Telefon, Typ Telefonu.

Uruchamiamy nasz kod F5. I jeżeli wszystko jest w porządku to otrzymamy komunikat „Command(s) completed successfully.”. W tym momencie w gałęzi Databases -> AdventureWorks2008R2 -> Programmability -> Stored Procedures powinna pojawić się procedura o nazwie ProcOsobyInformacje.

t-sql sql server procedury składowane stored procedures

Teraz możemy przetestować naszą procedurę, czy rzeczywiście zwraca poprawne wyniki. Wyszukamy informacje dotyczące osoby(lub osób) Terri Duffy. W tym celu klikamy prawym przyciskiem myszy (dalej PPM) i wybieramy opcję Execute Stored Procedure….

t-sql sql server procedury składowane stored procedures

W oknie Execute Procedure w tabelce ze zmiennymi (parametrami) w kolumnie Value wpisujemy odpowiednie wartości, dla imienia Terri, a dla nazwiska Duffy i nasz wybór potwierdzamy przyciskiem OK.

t-sql sql server procedury składowane stored procedures

Poniżej efekt wykonania naszej procedury.

t-sql sql server procedury składowane stored procedures

Widzimy, że SQL Server znalazł dwie osoby o takim samym imieniu i nazwisku, różniące się drugim imieniem. Teraz możemy sprawdzić czy jest to prawda w tabeli Person.Person zapytaniem wyszukującym osoby o tym imieniu i nazwisku.

Wynik uruchomienia naszego zapytania.

t-sql sql server procedury składowane stored procedures

Widzimy, że wszystko się zgadza.

Wywołać procedurę składowaną możemy także „ręcznie” wpisując w okno zapytania następujący kod.

Efekt będzie identyczny

SQL Server posiada także procedury już wbudowane oto najbardziej użyteczne z nich: sys.sp_addrolemember, sys.sp_adduser, sys.sp_catalogs, sys.sp_columns, sys.sp_databases itd. ale o tym w kolejnych wpisach.

Zapraszam do lektury kolejnych wpisów na Anonco.Pl

Pamiętaj:

  • Nie możesz utworzyć dwóch obiektów w bazie o takiej samej nazwie np. widok i procedura składowa. Jeżeli zdarzy się taka sytuacja w momencie próby utworzenia drugiego obiektu o tej samej nazwie co pierwszy otrzymasz komunikat „There is already an object named ‘tutaj_nazwa_obiektu’ in the database”. Dobrą praktyką jest nazywanie obiektów np. z przedrostkami np. Proc_ dla procedur lub View_ dla widoków itd.

  SQL tutorial. AdventureWorks exercises SQL SERVER

T-SQL SQL Server Korzystanie z widoków.

W jednym z poprzednich wpisów (link tutaj) utworzyliśmy widok który prezentuje listę osób z adresami, adresami e-mail i numerami telefonów (baza: AdventureWorks2008R2). Teraz napiszemy zapytanie które będzie korzystało z widoku jako źródła danych.

Przypomnę nasz widok  o nazwie OsobyInformacje zawiera dane z kilku tabel: Person.Person, Person.BusinessEntityAddress, Person.Address,  Person.EmailAddress, Person.PersonPhone, Person.PhoneNumberType. My napiszemy zapytanie które „wyciągnie” nam z naszego widoku: Imię, Nazwisko, Numer Telefonu i Typ Telefonu. Widzimy więc, że możemy dowolnie obrabiać dane z widoku i pobierać dane jakie tylko chcemy.

Kod zapytania poniżej

 

Zwróć uwagę, że w sekcji FROM jako źródło danych wskazujemy właśnie nasz widok o nazwie OsobyInformacje.

Poniżej efekt uruchomienia naszego zapytania.

t-sql sql server view use widok zapytanie

Jak widzimy uzyskaliśmy oczekiwany efekt.

Zapraszam do kolejnych wpisów.


  SQL tutorial. AdventureWorks exercises SQL SERVER

T-SQL SQL Server Tworzenie nowego widoku CREATE VIEW

Dzisiaj zajmiemy się poleceniem CreateView za pomocą którego tworzymy widoki. Widok to wirtualna tabela utworzona za pomocą zapytania mogąca zawierać dane z jednej lub wielu tabel. Z widoków możemy skorzystać w wielu sytuacjach oto kilka z nich:

  • Często korzystamy ze danych z wielu tabel (czynność powtarza się często i cyklicznie). W celu uproszczenia i przyspieszenia pracy z bazą danych możemy stworzyć sobie widok, który będzie „wirtualną tabelą” początkową do dalszej obróbki.
  • Wielu użytkowników korzysta z jednakowego początkowego zestawu danych (połączonych danych z wielu kolumn) ale później inaczej je obrabia.
  • Widok jest idealnym rozwiązaniem kiedy nie chcemy nadawać użytkownikom dostępu do tabel bazy, wtedy tworzymy potrzebny dla użytkownika widok i gotowe, użytkownicy mają dostęp do potrzebnego im widoku ale nie mogą nic zmodyfikować w tabelach źródłowych.

Składnia polecenia CREATEVIEW

 

Przykłady zastosowania polecenia CREATEVIEW

Przykład 1.
Utwórz widok o nazwie osoby na podstawie jednej tabeli Person.Person z bazy AdventureWorks 2008 R2.

Po uruchomieniu naszego zapytania przyciskiem F5 w oknie Messages  powinniśmy uzyskać komunikat Command(s) completed successfully. Teraz efekt naszego zapytania (utworzenia widoku), możemy także zobaczyć  w gałęzi Views w bazie AdventureWorks2008R2, powinien tak pojawić się nowy widok o nazwie Osoby (zrzut poniżej).

t-sql sql server create view

Jeżeli chcemy zobaczyć co zwraca nam nasz widok klikamy na nim prawym przyciskiem myszy (dalej PPM) i wybieramy opcję Select Top 1000 Rows.

t-sql sql server create view

I widzimy, że to jest dokładnie ten sam zestaw danych co w tabeli Person.Person.

t-sql sql server create view

Przykład 2.
Teraz stworzymy widok z danych z kilku tabel. Wyświetlimy dane dotyczące osób w bazie z ich adresami, adresami e-mail, telefonami (wraz z typem). W tym celu musimy złączyć dane z kilku tabel a mianowicie: Person.Person, Person.BusinessEntityAddress, Person.Address,  Person.EmailAddress, Person.PersonPhone, Person.PhoneNumberType. Ale nie chcemy wyświetlać wszystkich danych z powyższych kolumn. W naszym widoku ograniczymy się tylko do kolumn: ID osoby, Imię, Drugie Imię, Nazwisko, Miasto, Adres, E-mail, Telefon, Typ Telefonu.

Poniżej kod który utworzy nasz widok który nazwiemy OsobaInformacje

Analogicznie jak w przykładzie 1, po uruchomieniu naszego zapytania przyciskiem F5 w oknie Messages  powinniśmy uzyskać komunikat Command(s) completed successfully. W gałęzi Views w bazie AdventureWorks2008R2, powinien tak pojawić się nowy widok o nazwie OsobyInformacje (zrzut poniżej).

t-sql sql server create view

Jeżeli chcemy zobaczyć co zwraca nam nasz widok klikamy na nim prawym przyciskiem myszy (dalej PPM) i wybieramy opcję Select Top 1000 Rows. Poniżej efekt naszego zapytania.

t-sql sql server create view

 Teraz możemy korzystać z naszych widoków jak ze zwykłych tabel.

Zapraszam do kolejnych wpisów.


  SQL tutorial. AdventureWorks exercises SQL SERVER

T-SQL SQL Server wyświetlanie liczb zmiennoprzecinkowych.

W dzisiejszym wpisie zajmę się tematem wyświetlania liczb zmiennoprzecinkowych w SQL Serverze.

Problem:
Jak poprawnie wyświetlić wynik z dzielenia dwóch liczb (całkowitych), który jest liczbą zmiennoprzecinkowoą.

Krok 1
Zadeklarujmy sobie dwie liczby typu INT (tak żeby wynikiem była liczba zmiennoprzecinkowa) i spróbujmy wyświetlić wynik działania.

DECLARE @dzielna INT = 28;
DECLARE @dzielnik INT = 5;

SELECT
    @dzielna / @dzielnik AS Wynik

wynik poniżej

T-SQL SQL Server wyświetlanie liczb zmiennoprzecinkowych.

Jak widzimy w wyniku wyświetla się tylko liczba 5, czyli część przed przecinkiem ale nie ma części po przecinku bo prawidłowy wynik działania to 5,6

Krok 2
Teraz zminimy tym zmiennych z INT na NUMERIC i zobaczymy co się stanie


DECLARE @dzielna NUMERIC = 28;
DECLARE @dzielnik NUMERIC = 5;

SELECT
    @dzielna / @dzielnik AS Wynik

wynik poniżej

T-SQL SQL Server wyświetlanie liczb zmiennoprzecinkowych.

Wynik jest już prawidłowy ale wyświetlany jest z dużą dokładnością miejsc po przecinku. Rozwiązaniem tej sytuacji będzie zastosowanie funkcji CAST().

DECLARE @dzielna NUMERIC = 28;
DECLARE @dzielnik NUMERIC = 5;

SELECT
    CAST(@dzielna / @dzielnik AS NUMERIC(6,2)) AS Wynik


SQL tutorial. AdventureWorks exercises SQL SERVER  SQL tutorial. AdventureWorks exercises SQL SERVER

T-SQL ISNULL function

Jak już wiemy IS NULL to wartość nieokreślona i możemy "za jej pomocą" np. filtrować rekordy w zapytaniu (czytaj tutaj). Ale istnieje także funkcja ISNULL(). Funkcja ta zawiera dwa parametry ISNULL(sprawdzane_wyrażenie , wartość_do_zamiany). Funkcja ta na początku sprawdza czy w pierwszym parametr przyjmuje wartość NULL, jeśli tak to podmienia jego wartość na wartość drugiego parametru. Zobaczmy to na przykładzie.

Do tego przykłądu stworzyłem bazę "test" w której stworzyłem tabelę "table_test", a w niej trzy kolumny: kolA, kolB, kolC.
kolumna kolA – przechowuje kolory
kolumna kolB – przechowuje liczby
kolumna kolC – przechowuje liczebniki główne

Wyświetlmy teraz tabelę "table_test" zwykłym SELECT-em.

SELECT
     kolA
    ,kolB
    ,kolC
FROM
    table_test

Tabela po wyświetleniu wygląda tak:

sql t-sql commands isnull function

Zwróc uwagę, że w kolumnie "kolA" jest jedna wartość NULL i w kolumnie "kolB" jest jedna wartość NULL.
Jak zrobić, żeby zastąpić te wartości właściwymi wartościami np. w kolumnie która przechowuje kolory (kolA) wstawimy wartość 'brak koloru' a w kolumnie która przechowuje liczby (kolB) wstawimy wartość "0". Zaprogramujemy także, że jeżeli w kolumnie "kolC" znalazłaby się wartość NULL to zamienimy ją na "brak".

Do wykonania tego zadania użyjemy funkcji ISNULL i nasze zapytanie przybieże postać.

SELECT
     ISNULL(kolA , 'brak koloru') AS kolA
    ,ISNULL(kolB , 0) AS kolB
    ,ISNULL(kolC , 'brak') AS kolC
FROM
    table_test

Poniżej wynik uruchomienia zapytania.

sql t-sql commands isnull function

Jak widzimy na zrzucie wartości NULL w kolumnach "kolA" i "kolB" zostały zamienione na wskazane. W kolumnie "kolC" nie ma żadnych zmian bo nie było żadnej wartości NULL którą należało zamienić.


SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.

T-SQL pętla WHILE

[T-SQL] Pętla WHILE służy do wielokrotnego wykonywania fragmentu kodu, aż do momentu spełnienia zadeklarowanego przez nas warunku.

Składnia T-SQL WHILE

WHILE warunek
    BIGIN
        fragment kodu który będzie się powtarzał
        — w pętli musimy także "odnieść" się do
        — warunku żeby np. zwiększyć wartość zmiennej
        — która występuje w warunku w celu
        — żeby w konsekwencji warunek został spełniony
    END

Przykład.

5 razy wyświetl komunikat "To jest wiersz …" i za każdym razem w miejsce kropek wstaw wartość ze zmiennej @liczba którą inkrementuj o "1" za każdym przejściem pętli WHILE.

DECLARE @liczba int = 1;

WHILE @liczba <6
    BEGIN
        print 'To jest wiersz '+ CAST(@liczba AS VARCHAR)
        SET @liczba += 1 — zwiększamy wartość zmiennej @liczba o 1 za każdym przejściem pętli
    END

Poniżej wynik uruchomienia zapytania.

sql t-sql adventureworks tutorial practical exercises examples pętla while

pętle WHILE oczywiście możemy zagnieżdżać przykład poniżej

DECLARE @liczba int = 1;
DECLARE @liczba2 int = 1;

WHILE @liczba2 <5
    BEGIN
        print 'Pętla "zewnętrzna" wykonała się '+ CAST(@liczba2 AS VARCHAR) + ' razy'
        WHILE @liczba <6
            BEGIN
                print 'To jest wiersz '+ CAST(@liczba AS VARCHAR)
                SET @liczba += 1 — zwiększamy wartość zmiennej @liczba o 1 za każdym przejściem pętli
            END
        SET @liczba = 1
        SET @liczba2 += 1            
    END

Poniżej efekt uruchomienie zapytania

sql t-sql adventureworks tutorial practical exercises examples pętla while

 

Musimy jednak pamiętać o jednej bardzo ważnej rzeczy. W kodzie do pętli "zewnętrznej" (po wykonaniu się pętli "wewnętrznej") musimy ustawić licznik pętli "wewnętrznej" na wartość początkową, bo w przeciwnym razie pętla "wewnętrzna" wykona się tylko jednej raz przy pierwszym przejściu pętli "zewnętrznej".


Często się zdarza, że chcemy wykonać kod w pętli (i chcemy wykorzystać pętlę WHILE) w zależności czy zaistnieją jakieś okoliczności czy też nie np. chcemy zmodyfikować rekord ale nie wiemy czy któryś spełnia warunki wyszukiwania (do późniejszej modyfikacji). Wtedy w warunku do pętli WHILE możemy zastosować funkcję EXIST().

Przy pętlach WHILE musimy pamiętać, że w kodzie w środku pętli musi być taki kod który będzie w jakiś sposób modyfikował warunek bo inaczej zapętlimy pętle i będzie się ona wykonywała w nieskończoność.

Przykład.
W tabeli TabA zamień wszystkie wartości w kolumnie wartość które są równe 'dwa' na wartość 'cztery'.

 DECLARE @identyfikator int;
  WHILE EXISTS(SELECT TOP 1 id FROM TabA WHERE wartosc = 'dwa')
    BEGIN    
        SELECT TOP 1 @identyfikator = id FROM TabA WHERE wartosc = 'dwa'
        UPDATE TabA SET wartosc = 'cztery' WHERE id = @identyfikator
    END

zwróć uwagę że pętla wykona się tyle razy ile razy znajdzie rekord do zmiany (czyli gdzie w kolumnie "wartosc" znajdzie wartość 'dwa'). Jeżeli we wszystkich rekordach zamienimy 'dwa' na 'cztery' to wtedy warunek nie będzie już spełniony i pętla się zakończy.

A co by się stało gdyby warunek w pętli zmienić na EXISTS(SELECT TOP 1 id FROM TabA WHERE id = 1). Wtedy zapętlimy pętlę bo w pętli nigdzie nie modyfikujemy wartości id rekordu o wartości 1 (ID=1).


SQL tutorial. AdventureWorks exercises no.34. SQL SERVER.  SQL tutorial. AdventureWorks exercises no.34. SQL SERVER. SQL tutorial. AdventureWorks exercises SQL SERVER.