SQL serverio žymeklis yra d atabase objektas, leidžiantis mums vienu metu gauti kiekvieną eilutę ir manipuliuoti jos duomenimis . Žymeklis yra ne kas kita, kaip rodyklė į eilutę. Jis visada naudojamas kartu su SELECT sakiniu. Paprastai tai yra kolekcija SQL logika, kuri po vieną pereina iš anksto nustatytą eilučių skaičių. Paprasta žymeklio iliustracija yra tada, kai turime didelę darbuotojų įrašų duomenų bazę ir norime apskaičiuoti kiekvieno darbuotojo atlyginimą atskaičius mokesčius ir atostogas.
SQL serveris žymeklio paskirtis yra atnaujinti duomenis eilutę po eilės, keisti arba atlikti skaičiavimus, kurie neįmanomi, kai gauname visus įrašus vienu metu . Tai taip pat naudinga atliekant administracines užduotis, pvz., SQL serverio duomenų bazės atsargines kopijas nuosekliai. Žymekliai daugiausia naudojami kūrimo, DBA ir ETL procesuose.
Šiame straipsnyje paaiškinama viskas apie SQL serverio žymeklį, pvz., žymeklio gyvavimo ciklas, kodėl ir kada naudojamas žymeklis, kaip įdiegti žymeklius, jo apribojimai ir kaip galime pakeisti žymeklį.
Žymeklio gyvavimo ciklas
Galime apibūdinti žymeklio gyvavimo ciklą į penki skirtingi skyriai taip:
1: paskelbti žymeklį
Pirmasis žingsnis yra paskelbti žymeklį naudojant toliau pateiktą SQL sakinį:
java skaityti csv failą
DECLARE cursor_name CURSOR FOR select_statement;
Žymeklį galime deklaruoti nurodę jo pavadinimą duomenų tipu CURSOR po raktinio žodžio DECLARE. Tada parašysime teiginį SELECT, kuris apibrėžia žymeklio išvestį.
2: Atidarykite žymeklį
Tai antras žingsnis, kai atidarome žymeklį, kad išsaugotume duomenis, gautus iš rezultatų rinkinio. Tai galime padaryti naudodami toliau pateiktą SQL sakinį:
OPEN cursor_name;
3: Paimkite žymeklį
Tai trečiasis veiksmas, kurio metu eilutes galima gauti po vieną arba bloke, kad būtų galima manipuliuoti duomenimis, pvz., įterpti, atnaujinti ir ištrinti šiuo metu aktyvioje žymeklio eilutėje. Tai galime padaryti naudodami toliau pateiktą SQL sakinį:
FETCH NEXT FROM cursor INTO variable_list;
Taip pat galime naudoti @@FETCHSTATUS funkcija SQL Server, kad gautumėte naujausio FETCH sakinio žymeklio, kuris buvo įvykdytas prieš žymeklį, būseną. The ATGAUTI pareiškimas buvo sėkmingas, kai @@FETCHSTATUS išvestis nulinė. The KOL teiginys gali būti naudojamas norint gauti visus įrašus iš žymeklio. Šis kodas tai paaiškina aiškiau:
WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM cursor_name; END;
4: Uždarykite žymeklį
Tai ketvirtas veiksmas, kurio metu žymeklis turėtų būti uždarytas, kai baigsime darbą su žymekliu. Tai galime padaryti naudodami toliau pateiktą SQL sakinį:
CLOSE cursor_name;
5: panaikinti žymeklio paskirstymą
Tai penktasis ir paskutinis žingsnis, kurio metu ištrinsime žymeklio apibrėžimą ir išleisime visus su žymekliu susijusius sistemos išteklius. Tai galime padaryti naudodami toliau pateiktą SQL sakinį:
DEALLOCATE cursor_name;
SQL serverio žymeklio naudojimas
Žinome, kad reliacinės duomenų bazių valdymo sistemos, įskaitant SQL Server, puikiai tvarko duomenis eilučių, vadinamų rezultatų rinkiniais, rinkinyje. Pavyzdžiui , turime staliuką produktų_lentelė kuriame yra produktų aprašymai. Jei norime atnaujinti kaina produkto, tada žemiau ATNAUJINTI' užklausa atnaujins visus įrašus, atitinkančius sąlygą KUR' sąlyga:
UPDATE product_table SET unit_price = 100 WHERE product_id = 105;
Kartais programai reikia apdoroti eilutes pavieniui, t. y. eilutę po eilutės, o ne visą rezultatų rinkinį iš karto. Šį procesą galime atlikti naudodami žymeklius SQL serveryje. Prieš naudodami žymeklį, turime žinoti, kad žymekliai yra labai prastai veikiantys, todėl jį visada reikia naudoti tik tada, kai nėra jokios parinkties, išskyrus žymeklį.
Žymeklis naudoja tą pačią techniką, kaip ir tokias kilpas kaip FOREACH, FOR, WHILE, DO WHILE, kad vienu metu kartotų vieną objektą visomis programavimo kalbomis. Vadinasi, jį galima pasirinkti, nes jame taikoma ta pati logika kaip ir programavimo kalbos kilpos procesas.
Kursorių tipai SQL serveryje
Toliau pateikiami skirtingi SQL serverio žymeklių tipai:
- Statiniai žymekliai
- Dinaminiai žymekliai
- Tik pirmyn nukreipti žymekliai
- Keyset žymekliai
Statiniai žymekliai
Statinio žymeklio rodomas rezultatų rinkinys visada yra toks pat, kaip ir pirmą kartą atidarius žymeklį. Kadangi statinis žymeklis išsaugos rezultatą tempdb , jie visada yra Tik skaitymui . Statinį žymeklį galime naudoti norėdami judėti pirmyn ir atgal. Priešingai nei kiti žymekliai, jis veikia lėčiau ir sunaudoja daugiau atminties. Dėl to galime jį naudoti tik tada, kai reikia slinkti, o kiti žymekliai netinka.
Šis žymeklis rodo eilutes, kurios buvo pašalintos iš duomenų bazės ją atidarius. Statinis žymeklis neatspindi jokių INSERT, UPDATE arba DELETE operacijų (nebent žymeklis uždaromas ir atidaromas iš naujo).
konvertuoti eilutę į enum
Dinaminiai žymekliai
Dinaminiai žymekliai yra priešingi statiniams žymekliams, kurie leidžia atlikti duomenų atnaujinimo, trynimo ir įterpimo operacijas, kai žymeklis atidarytas. tai yra slenkama pagal numatytuosius nustatymus . Jis gali aptikti visus eilučių, tvarkos ir reikšmių pakeitimus rezultatų rinkinyje, nesvarbu, ar pakeitimai vyksta žymeklio viduje, ar už jo ribų. Už žymeklio ribų mes nematysime atnaujinimų, kol jie nebus patvirtinti.
Tik pirmyn nukreipti žymekliai
Tai numatytasis ir greičiausias žymeklio tipas tarp visų žymeklių. Jis vadinamas tik pirmyn nukreiptu žymekliu, nes jis per rezultatų rinkinį juda tik į priekį . Šis žymeklis nepalaiko slinkimo. Jis gali gauti tik eilutes nuo rezultatų rinkinio pradžios iki pabaigos. Tai leidžia mums atlikti įterpimo, atnaujinimo ir ištrynimo operacijas. Čia matomas vartotojo atliktų įterpimo, atnaujinimo ir ištrynimo operacijų, turinčių įtakos rezultatų rinkinio eilutėms, poveikis, kai eilutės paimamos iš žymeklio. Kai eilutė buvo gauta, per žymeklį nematome eilučių pakeitimų.
Tik pirmyn nukreipti žymekliai yra suskirstyti į tris tipus:
- Forward_Only Keyset
- Forward_Only Static
- Pirmyn
Keyset varomi žymekliai
Ši žymeklio funkcija yra tarp statinio ir dinaminio žymeklio apie jo gebėjimą aptikti pokyčius. Jis ne visada gali aptikti rezultatų rinkinio narystės ir tvarkos pokyčius kaip statinis žymeklis. Jis gali aptikti rezultatų rinkinio eilučių verčių pokyčius kaip dinaminis žymeklis. Gali tik pereiti iš pirmos į paskutinę ir paskutinės į pirmą eilutę . Užsakymas ir narystė fiksuojami kiekvieną kartą atidarius šį žymeklį.
Jį valdo unikalių identifikatorių rinkinys, toks pat kaip ir raktų rinkinio raktai. Raktų rinkinys nustatomas pagal visas eilutes, kurios kvalifikavo SELECT sakinį, kai žymeklis buvo pirmą kartą atidarytas. Jis taip pat gali aptikti bet kokius duomenų šaltinio, kuris palaiko atnaujinimo ir ištrynimo operacijas, pakeitimus. Pagal numatytuosius nustatymus jis yra slenkamas.
Pavyzdžio įgyvendinimas
Įdiegsime žymeklio pavyzdį SQL serveryje. Tai galime padaryti pirmiausia sukurdami lentelę pavadinimu ' klientas “, naudojant toliau pateiktą teiginį:
CREATE TABLE customer ( id int PRIMARY KEY, c_name nvarchar(45) NOT NULL, email nvarchar(45) NOT NULL, city nvarchar(25) NOT NULL );
Toliau į lentelę įterpsime reikšmes. Norėdami įtraukti duomenis į lentelę, galime vykdyti toliau pateiktą teiginį:
INSERT INTO customer (id, c_name, email, city) VALUES (1,'Steffen', '[email protected]', 'Texas'), (2, 'Joseph', '[email protected]', 'Alaska'), (3, 'Peter', '[email protected]', 'California'), (4,'Donald', '[email protected]', 'New York'), (5, 'Kevin', '[email protected]', 'Florida'), (6, 'Marielia', '[email protected]', 'Arizona'), (7,'Antonio', '[email protected]', 'New York'), (8, 'Diego', '[email protected]', 'California');
Mes galime patikrinti duomenis vykdydami PASIRINKTI pareiškimas:
SELECT * FROM customer;
Įvykdę užklausą, mes matome žemiau pateiktą išvestį, kur turime aštuonios eilutės į lentelę:
Dabar sukursime žymeklį, kad būtų rodomi klientų įrašai. Toliau pateikti kodo fragmentai paaiškina visus žymeklio deklaravimo arba kūrimo veiksmus, viską sudėjus:
jautis vs bulius
--Declare the variables for holding data. DECLARE @id INT, @c_name NVARCHAR(50), @city NVARCHAR(50) --Declare and set counter. DECLARE @Counter INT SET @Counter = 1 --Declare a cursor DECLARE PrintCustomers CURSOR FOR SELECT id, c_name, city FROM customer --Open cursor OPEN PrintCustomers --Fetch the record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city --LOOP UNTIL RECORDS ARE AVAILABLE. WHILE @@FETCH_STATUS = 0 BEGIN IF @Counter = 1 BEGIN PRINT 'id' + CHAR(9) + 'c_name' + CHAR(9) + CHAR(9) + 'city' PRINT '--------------------------' END --Print the current record PRINT CAST(@id AS NVARCHAR(10)) + CHAR(9) + @c_name + CHAR(9) + CHAR(9) + @city --Increment the counter variable SET @Counter = @Counter + 1 --Fetch the next record into the variables. FETCH NEXT FROM PrintCustomers INTO @id, @c_name, @city END --Close the cursor CLOSE PrintCustomers --Deallocate the cursor DEALLOCATE PrintCustomers
Įvykdę žymeklį, gausime žemiau pateiktą išvestį:
SQL serverio žymeklio apribojimai
Žymeklis turi tam tikrų apribojimų, todėl jis visada turėtų būti naudojamas tik tada, kai nėra jokios parinkties, išskyrus žymeklį. Šie apribojimai yra:
- Žymeklis eikvoja tinklo išteklius, nes kiekvieną kartą, kai gaunamas įrašas, reikalauja tinklo kelionės pirmyn ir atgal.
- Žymeklis yra atminties nuolatinis rodyklių rinkinys, o tai reiškia, kad reikia šiek tiek atminties, kurią kiti procesai galėtų naudoti mūsų kompiuteryje.
- Apdorojant duomenis, užrakinama lentelės dalis arba visa lentelė.
- Žymeklio našumas ir greitis yra lėtesni, nes jie atnaujina lentelės įrašus po vieną eilutę.
- Žymekliai yra greitesni nei while kilpos, tačiau jie turi daugiau papildomų išlaidų.
- Į žymeklį įtrauktų eilučių ir stulpelių skaičius yra dar vienas aspektas, turintis įtakos žymeklio greičiui. Tai nurodo, kiek laiko reikia atidaryti žymeklį ir įvykdyti iškvietimo teiginį.
Kaip galime išvengti kursorių?
Pagrindinis kursorių darbas yra eiti lentelės eilutę po eilės. Paprasčiausias būdas išvengti žymeklio pateiktas žemiau:
SQL, while ciklo naudojimas
Lengviausias būdas išvengti žymeklio naudojimo yra naudoti ciklą, kuris leidžia įterpti rezultatų rinkinį į laikinąją lentelę.
Vartotojo nustatytos funkcijos
Kartais žymekliai naudojami gautam eilučių rinkiniui apskaičiuoti. Tai galime padaryti naudodami vartotojo apibrėžtą funkciją, kuri atitinka reikalavimus.
Jungčių naudojimas
Join apdoroja tik tuos stulpelius, kurie atitinka nurodytą sąlygą ir taip sumažina kodo eilutes, kurios užtikrina greitesnį veikimą nei žymekliai, jei reikia apdoroti didžiulius įrašus.