Sql dodjeljivanje vrijednosti varijabli. Varijable. Globalne sistemske varijable

Najnovije ažuriranje: 14.08.2017

Možemo proslijediti podatke upitima kroz varijable. Takođe možemo primiti podatke koji su rezultat upita u varijable. Na primjer, kada biramo iz tablica pomoću naredbe SELECT, možemo dohvatiti podatke u varijablu koristeći sljedeću sintaksu:

SELECT @variable_1 = kolona_1 specifikacija, @varijable_2 = kolona_2 specifikacija, ................................... @ varijabla_N = kolona_N specifikacija

Dodatno, u SET izrazu, vrijednost dodijeljena varijabli također može biti rezultat SELECT izraza.

Na primjer, recimo da imamo sljedeće tabele:

CREATE TABLE Proizvodi (Id INT IDENTITET PRIMARY KEY, ProductName NVARCHAR(30) NOT NULL, Proizvođač NVARCHAR(20) NOT NULL, ProductCount INT DEFAULT 0, Price MONEY NOT NULL); CREATE TABLE Kupci (Id INT IDENTITETA PRIMARNI KLJUČ, Ime NVARCHAR(30) NOT NULL); CREATE TABLE Narudžbe (Id INT IDENTITETA PRIMARNI KLJUČ, ProductId INT NOT NULL REFERENCE Proizvodi(Id) NA DELETE CASCADE, CustomerId INT NOT NULL REFERENCES Kupci (Id) NA DELETE CASCADE, CreatedAt DATE NOT NULL BROJ PROIZVODA, INT NULL DENULL Cijena );

Prilikom preuzimanja podataka koristimo varijable:

DEKLARI @maxPrice NOVAC, @minPrice NOVAC, @dif NOVAC, @count INT SET @count = (IZABIR SUM(ProductCount) IZ naloga); SELECT @minPrice=MIN(Cijena), @maxPrice = MAX(Cijena) IZ proizvoda SET @dif = @maxPrice - @minPrice; PRINT "Ukupno prodato: " + STR(@count, 5) + " artikal(i)"; PRINT "Razlika između maksimalne i minimalne cijene: " + STR(@dif)

U ovom slučaju, varijabla @count će sadržavati zbir svih vrijednosti iz stupca ProductCount tabele Orders, odnosno ukupan broj prodanih proizvoda.

Varijable @min i @max pohranjuju minimalne i maksimalne vrijednosti stupca Cijena iz tabele Proizvodi, respektivno, a varijabla @dif pohranjuje razliku između ovih vrijednosti. I slično jednostavne vrijednosti, varijable također mogu učestvovati u operacijama.

Drugi primjer:

DECLARE @sum MONEY, @id INT, @prodid INT, @name NVARCHAR(20); SET @id=2; SELECT @sum = SUM(Orders.Price*Orders.ProductCount), @name=Products.ProductName, @prodid = Products.Id FROM Orders INNER JOIN Proizvodi NA ProductId = ProductId GROUP BY Products.ProductName, Products.Id HAVING Products .Id=@id PRINT "Proizvod " + @name + " prodat za iznos od " + STR(@sum)

Ovdje su preuzeti podaci iz dvije tabele Proizvodi i Narudžbe grupirani po kolonama Id i ProductName iz tabele Proizvodi. Podaci se zatim filtriraju po koloni Id iz Proizvodi. I ekstrahovani podaci završavaju u varijablama @sum, @name, @prodid.

U ovom materijalu ćemo pogledati osnove programiranja u T-SQL jeziku, saznaćemo o kakvom je jeziku riječ, koje osnovne mogućnosti ima, koje konstrukcije uključuje i, naravno, u procesu svega toga dat ću primjere koda.

I želio bih početi s činjenicom da smo na ovoj stranici vi i ja već posvetili dosta materijala SQL jeziku, a posebno njegovoj ekstenziji Transact-SQL ( Kako razumete T-SQL je skraćenica za Transact-SQL). Čak smo sastavili i mali vodič za početnike dati jezik i, naravno, pogledali smo mnoge primjere, ali kao takvo programiranje u T-SQL-u postoje, na primjer, varijable, uslovne konstrukcije, komentari, dotakli smo se, ali se nismo fokusirali na ovo. Ali budući da imamo stranicu za programere početnike, odlučio sam posvetiti ovaj materijal ovim osnovama.

T-SQL programski jezik

Transact-SQL (T-SQL) je proširenje SQL jezika iz Microsofta i koristi se u SQL Server za programiranje baze podataka.

SQL Server uključuje mnoge konstrukcije, komponente i funkcije koje proširuju mogućnosti ANSI standardnog SQL jezika, uključujući klasično programiranje, koje se razlikuje od konvencionalnog pisanja upita.

A danas ćemo pogledati onaj dio osnova T-SQL jezika, koji uključuje pisanje koda za implementaciju određene funkcionalnosti ( na primjer, u proceduri ili funkciji), a ne samo neki upit baze podataka.

Varijable u T-SQL-u

I počećemo sa varijablama, one su potrebne kako bismo pohranili neke privremene podatke koje moramo sačuvati neko vrijeme i onda ih koristiti.

Postoje dvije vrste varijabli u T-SQL-u - lokalne i globalne. Lokalne varijable postoje samo unutar sesije tokom koje su kreirane, a globalne varijable se koriste za dobijanje informacija o SQL serveru ili nekih promenljivih informacija u bazi podataka.

Lokalne varijable se deklariraju pomoću ključne riječi DECLARE i počnite sa znakom @ . Kao iu mnogim programskim jezicima, varijable u T-SQL-u moraju imati specifičan tip podataka. U SQL serveru postoji dosta tipova podataka, detaljno smo ih ispitali u priručniku koji sam pomenuo gore.

Možete koristiti naredbe za dodjelu vrijednosti varijabli SET ili Odaberite.

Kao što sam već rekao, globalne varijable su potrebne da bi se dobile bilo kakve informacije o serveru ili bazi podataka, na primjer, globalne varijable u SQL Serveru uključuju:

  • @@ROWCOUNT – pohranjuje broj zapisa obrađenih prethodnom komandom;
  • @@ERROR – vraća šifru greške za poslednju komandu;
  • @@SERVERNAME — ime lokalnog SQL servera;
  • @@VERSION - broj SQL verzije Server;
  • @@IDENTITY je zadnja vrijednost brojača koja se koristi u operaciji umetanja ( insert).

Sada, kao primjer, napravimo dvije varijable sa tipom podataka INT, dodijelimo im vrijednosti, prvu pomoću naredbe SET, a drugu pomoću naredbe Select, a zatim jednostavno prikažimo ove vrijednosti i također prikažemo vrijednost @@VERSION varijabla, tj. Saznajte verziju SQL servera.

DECLARE @TestVar1 INT DECLARE @TestVar2 INT SET @TestVar1 = 1 SELECT @TestVar2 = 2 SELECT @TestVar1 AS [Variable 1], @TestVar2 AS [Variable 2], @@VERSION AS [SQL Server Version]

Paketi

Paket u T-SQL- to su SQL naredbe ili izrazi koji su kombinovani u jednu grupu i SQL server će ih kompajlirati i izvršiti kao cjelinu.

Da biste omogućili SQL serveru da shvati da prosljeđujete niz naredbi, morate navesti ključnu riječ GO nakon svih naredbi koje želite kombinirati u paket.

Lokalne varijable će biti vidljive samo unutar paketa u kojem su kreirane, tj. Više nećete moći pristupiti varijabli nakon što se paket završi.

Recimo ako se primjer koji smo koristili iznad kombinuje u paket i onda pokušamo dobiti vrijednosti varijabli, onda ćemo dobiti sljedeće:


One. vidimo da imamo grešku zbog činjenice da varijabla @TestVar1 nije deklarirana.

Uslovi

Ove konstrukcije podrazumijevaju grananje, tj. Ovisno o tome da li su određeni uvjeti ispunjeni ili ne, T-SQL izrazi će promijeniti smjer.

AKO... JEDNOM

Ova konstrukcija postoji, vjerovatno u svim programskim jezicima, uključuje provjeru da li su uslovi ispunjeni i ako su sve provjere prođene, onda se izvršava naredba koja slijedi, ako ne, onda se ništa ne izvršava, ali možete specificirati ključnu riječ ELSE i zatim u u ovom slučaju navedeni operatori će se izvršiti nakon ove riječi.

DECLARE @TestVar1 INT DECLARE @TestVar2 VARCHAR(20) SET @TestVar1 = 5 IF @TestVar1 > 0 SET @TestVar2 = "Veće od 0" ELSE SET @TestVar2 = "Manje od 0" SELECT AS @TestVar1 vrijednost

AKO POSTOJI

Ova konstrukcija vam omogućava da odredite prisustvo zapisa definisanih uslovom. Na primjer, želimo da znamo da li postoje određeni zapisi u tabeli i kada se otkrije prvo podudaranje, obrada komande se zaustavlja. Ovo je u suštini isto kao COUNT(*) > 0.

Na primjer, želimo provjeriti da li u tablici test_table postoje zapisi sa vrijednosti id >=0 i na osnovu toga ćemo odlučiti kako dalje


DECLARE @TestVar VARCHAR(20) IF EXISTS(SELECT * FROM test_table WHERE id > = 0) SET @TestVar = "Postoje zapisi" ELSE SET @TestVar = "Nema zapisa" SELECT @TestVar AS [ Dostupnost zapisa]

CASE

Ova konstrukcija se koristi zajedno sa naredbom za odabir i namijenjena je zamjeni ponovljene upotrebe IF konstrukcije. Korisno je u slučajevima kada trebate provjeriti varijablu ( ili polje) za prisustvo određenih vrijednosti.


DECLARE @TestVar1 INT DECLARE @TestVar2 VARCHAR(20) SET @TestVar1 = 1 SELECT @TestVar2 = CASE @TestVar1 KADA 1 ONDA "Jedan" KADA 2 ONDA "Dva" OSTALO "Nepoznato" END SELECT AS [TestVar2]

POČNI...KRAJ

Ova konstrukcija je neophodna za kreiranje bloka naredbi, tj. na primjer, ako ne želimo izvršiti jednu naredbu nakon bloka IF, već nekoliko, tada bismo morali napisati sve naredbe unutar bloka BEGIN...END.

Modificirajmo naš prethodni primjer ( o AKO POSTOJI) tako da ako u tabeli test_table postoje zapisi id > = 0, osim dodjeljivanja vrijednosti varijabli @TestVar, izvršićemo i ažuriranje, tj. ažuriranje nekih podataka u istoj tabeli, kao i prikaz broja redova koje smo ažurirali pomoću globalne varijable @@ROWCOUNT.


DECLARE @TestVar1 VARCHAR(20) DECLARE @TestVar2 INT SET @TestVar2 = 0 AKO POSTOJI(SELECT * FROM test_table WHERE id > = 0) BEGIN SET @TestVar1 = "Zapisi postoje" UPDATE test_table POSTAVI kolona1 = 5 WHER @TestVar2 = @@ROWCOUNT END ELSE SET @TestVar1 = "Nema zapisa" SELECT @TestVar1 AS [prisutni zapisi], @TestVar2 AS [Redovi zahvaćeni:]

T-SQL petlje

Ako govorimo o petljama općenito, one su potrebne za ponavljanje izvršavanja naredbi mnogo puta. U T-SQL-u postoji jedna petlja DOK uz preduvjet, to znači da će naredbe početi, i da će se ponavljati sve dok je ispunjen uslov prije početka petlje, također se izvršavanje petlje može kontrolirati pomoću ključnih riječi BREAK I NASTAVI.


DECLARE @Cnt INT = 1, @result INT = 0, @CountRow INT SELECT @CountRow = COUNT(*) IZ test_table DOK @Cnt<= @CountRow BEGIN SET @Cnt += 1 SET @result += 1 IF @Cnt = 20 BREAK ELSE CONTINUE END SELECT @result AS [Количество выполнений цикла:]

IN u ovom primjeru Prvo, naravno, deklariramo varijable ( Odmah inicijaliziramo Cnt i rezultat, na ovaj način možete postaviti vrijednosti varijabli počevši od SQL Servera 2008). Zatim saznajemo koliko je redova u tablici test_table i nakon toga provjeravamo da li je broj redova u tabeli veći ili jednak našem brojaču, zatim ulazimo u našu testnu petlju. U petlji povećavamo vrijednost brojača, upisujemo rezultat i ponovo provjeravamo, ako je naš brojač već dostigao vrijednost 20, onda ćemo ga natjerati da se završi, ako ne, onda neka nastavi dok vrijednost brojača ne postane veća ili jednaka na broj redova u tabeli ili do 20 ako ima više redova u tabeli.

Komentari

Oni su potrebni za objašnjenje i bilježenje u kodu, jer ako je kod velik i složen, onda ćete nakon nekog vremena jednostavno zaboraviti zašto je to tačno i zašto ste napisali ovaj ili onaj dio koda. U T-SQL-u postoje jednoredni (-Text) i višeredni komentari (/*Text*/).


T-SQL naredbe

GOTO

Koristeći ovu naredbu, možete se kretati kroz kod do određene oznake. Na primjer, može se koristiti kada želite da napravite neku vrstu petlje, ali bez while.


DECLARE @Cnt INT = 0 Label: --Postavite oznaku SET @Cnt += 1 --Dodajte 1 varijablu ako @Cnt< 10 GOTO Metka --Если значение меньше 10, то переходим к метке SELECT @Cnt AS [Значение Cnt =]

WAITFOR

Komanda može pauzirati izvršenje koda na određeni vremenski period ili do određenog vremena. Parametar DELAY pravi pauzu određene dužine, i VRIJEME pauzira proces do određenog vremena. Vrijednosti parametara navedene su u formatu hh:mi:ss


DECLARE @TimeStart time, @TimeEnd time SET @TimeStart = CONVERT (vrijeme, GETDATE())--Saznaj vrijeme WAITFOR DELAY "00:00:05"--Pauza na 5 sekundi SET @TimeEnd = CONVERT (vrijeme, GETDATE ()) )--Ponovo saznajte vrijeme --Saznajte koliko je vremena prošlo u sekundama SELECT DATEDIFF(ss, @TimeStart, @TimeEnd) AS [Prošle sekunde:]

RETURN

Ova naredba se koristi za bezuvjetni izlazak iz upita ili procedure. RETURN se može koristiti u bilo kojem trenutku za izlazak iz procedure, serije ili bloka izraza. Sve što dolazi nakon ove naredbe se ne izvršava.


DECLARE @Cnt INT = 1, @result varchar(15) /*Ako je vrijednost Cnt manja od 0, sljedeće komande neće biti izvršene i nećete vidjeti stupac [Result:]*/ IF @Cnt< 0 RETURN SET @result = "Cnt больше 0" SELECT @result AS [Результат:]

PRINT

Za slanje servisne poruke možete koristiti naredbu PRINT. U Management Studiju, ova poruka će se pojaviti na kartici Poruke ( Poruke).


DECLARE @Cnt INT = 10, @TestVar varchar(100) IF @Cnt > 0 SET @TestVar = "Vrijednost varijable Cnt je veća od 0 i jednaka je " + CAST(@Cnt AS VARCHAR(10)) ElSE SET @TestVar = "Vrijednost varijable Cnt je manja od 0 i jednaka je " + CAST(@Cnt AS VARCHAR(10)) PRINT @TestVar

Transakcije

Transakcija je naredba ili blok naredbi koja se uspješno završava ili je otkazana u cjelini. Drugim riječima, ako jedna naredba ili instrukcija unutar transakcije ne uspije, onda se poništava i sve što je obrađeno prije nje, čak i ako su prethodne naredbe uspješno završene.

Ovaj mehanizam je neophodan da bi se osigurao integritet podataka, tj. Recimo da imate proceduru koja prenosi novac sa jednog računa na drugi, ali može doći do situacije u kojoj je novac povučen sa računa, a nije stigao na drugi račun. Na primjer, SQL instrukcija koja podiže novac je proradila, ali prilikom izvršavanja instrukcije koja je deponovala novac, došlo je do greške, drugim riječima, novac je povučen i jednostavno izgubljen. Da bi se to spriječilo, svi SQL izrazi se pišu unutar transakcije, a onda ako dođe do takve situacije, sve promjene će biti poništene, tj. novac će biti vraćen na vaš račun.

Saznajte šta imamo u tabeli (id = IDENTITET) SELECT * FROM test_table --Započnite transakciju BEGIN TRAN --Prvo ažurirajte sve podatke UPDATE test_table SET column1 = column1 - 5 --Zatim jednostavno dodajte redove sa novim vrijednostima INSERT INTO test_table SELECT column1 FROM test_table --Ako postoji greška, onda otkažite sve IF @@error != 0 POČNI VRATI TRAN POVRATAK END COMMIT TRAN --Pogledaj šta se dogodilo SELECT * IZ test_table

U ovom primjeru, ako smo imali grešku u trenutku dodavanja podataka (INSERT), tada bi UPDATE bilo poništeno.

Rukovanje greškom - TRY...CATCH konstrukcija

Tokom izvršavanja T-SQL koda može doći do neočekivane situacije, tj. greška koju treba otkloniti. U SQL serveru, počevši od SQL Servera 2005, postoji takva konstrukcija kao POKUŠAJTE...HVATI, koji može pratiti grešku.


POČNITE POKUŠAJTE DECLARE @TestVar1 INT = 10, @TestVar2 INT = 0, @result INT SET @result = @TestVar1 / @TestVar2 END POKUŠAJTE BEGIN HVATI SELECT ERROR_NUMBER() KAO [Broj greške], ERROR_MESSAGE() KAO [Opis greške] CATCH

U ovom primjeru se pojavila situacija da dolazi do dijeljenja sa nulom ( Kao što znate, ne možete podijeliti sa 0) i pošto je naš blok koda stavljen u TRY konstrukciju, dobili smo izuzetak u kojem jednostavno dobijamo broj greške i njen opis.

Mislim da je ovo dovoljno za osnove, ako želite detaljnije proučiti sve konstrukcije T-SQL jezika, preporučujem da pročitate moju knjigu “The T-SQL Programmer's Way”, koja već govori o T-SQL jeziku u detaljnije, to je sve za mene, sretno!

Postavljanje varijabilnih vrijednosti

Trenutno u SQL jezik Postoje dva načina za postavljanje vrijednosti varijable - u tu svrhu možete koristiti SELECT ili SET izraz. U smislu funkcionalnosti, ovi izrazi rade gotovo identično, osim što naredba SELECT omogućava da dobijete originalnu vrijednost dodjele iz tablice navedene u SELECT izrazu.

Naredba SET se obično koristi za postavljanje vrijednosti varijabli u obliku koji se češće nalazi u proceduralnim jezicima. Tipični primjeri upotrebe ovog operatora uključuju sljedeće:

SET @b = @a * 1.5

Imajte na umu da svi ovi izrazi izvode direktne operacije dodjeljivanja, bilo koristeći eksplicitne vrijednosti ili druge varijable. Nije moguće dodijeliti korištenjem SET izraza varijabilna vrijednost, dobijeno na zahtjev; upit se mora izvršiti zasebno i tek nakon toga se rezultat može dodijeliti pomoću naredbe SET. Na primjer, pokušaj izvršenja takve naredbe uzrokuje grešku:

SET @c = COUNT(*) IZ Grada

i sljedeća naredba se izvršava prilično uspješno:

SET @c = (ODABIR BROJ(*) IZ Grada)

SELECT izraz obično se koristi za dodjelu vrijednosti varijablama kada je izvor informacija koje treba pohraniti u varijablu upit. Na primjer, radnje koje se izvode u kodu iznad se mnogo češće implementiraju pomoću SELECT naredbe:

SELECT @c = COUNT(*) IZ Grada

Imajte na umu da ovaj kod malo jasniji (naročito je sažetiji, iako radi iste radnje).

Stoga je moguće formulirati sljedeću općenito prihvaćenu konvenciju za korištenje oba operatora.

Naredba SET se koristi kada treba izvršiti jednostavnu operaciju dodjele varijabli, tj. ako je dodeljena vrednost već data eksplicitno u obliku određene vrednosti ili u obliku neke druge varijable.

Naredba SELECT se koristi kada se dodjela vrijednosti varijabli mora temeljiti na upitu.

Korištenje varijabli u SQL upiti

Jedno od korisnih svojstava T-SQL-a je da se varijable mogu koristiti u upitima bez potrebe za kreiranjem složenih dinamičkih stringova koji ugrađuju varijable u programski kod. Dinamički SQL i dalje postoji, ali se jedna vrijednost može lakše promijeniti - korištenjem varijable.

Gdje god se izraz može koristiti u upitu, može se koristiti i varijabla. Sljedeći primjer pokazuje upotrebu varijable u klauzuli WHERE:

DECLARE @IdProd int;

SET @IdProd = 1;

SELECT

Microsoft SQL Server ima poseban tip podataka TABLE, na osnovu kojeg možemo kreirati varijable tabele, kako biste ih koristili u svojim uputstvima i procedurama, a danas ćemo pogledati ove varijable, saznati kako su deklarirane i koje karakteristike imaju ove varijable.

Opis varijabli tablice MS SQL Servera

Varijable tabele su varijable sa posebnim tipom podataka TABLE koje se koriste za privremeno pohranjivanje rezultirajućeg skupa podataka u obliku redova tablice. Pojavili su se još u verziji SQL servera iz 2005. godine. Takve varijable možete koristiti u pohranjenim procedurama, u funkcijama, u okidačima i u regularnim SQL paketima. Tabelarne varijable se kreiraju na isti način kao i obične varijable tako što se deklarišu naredbom DECLARE.

Varijable ovog tipa su zamišljene kao alternativa privremenim tabelama. Ako govorimo o tome da li je bolje koristiti tablične varijable ili privremene tabele, onda nema jasnog odgovora da varijable tablice imaju i prednosti i nedostatke. Na primjer, ja lično volim da koristim varijable tablice jer su zgodne za kreiranje ( one. proglasiti) i nema potrebe razmišljati o njihovom uklanjanju ili brisanju na kraju instrukcija, jer se automatski brišu ( baš kao i obične varijable). Ali u isto vrijeme, bolje je koristiti varijable tablice samo kada ćete u njih pohraniti malu količinu podataka, inače se preporučuje korištenje privremenih tablica.

Prednosti varijabli tablice u Microsoft SQL Serveru

  • Varijable tablice se ponašaju kao lokalne varijable. Imaju precizno definisano polje primene;
  • Varijable tabele se automatski brišu na kraju izraza gde su definisane;
  • Kada koristite varijable tablice u pohranjenim procedurama, rekompilacije se dešavaju rjeđe nego kada se koriste privremene tablice;
  • Transakcije koje koriste varijable TABLE nastavljaju se samo dok se odgovarajuća varijabla ažurira. Zbog toga je manja vjerovatnoća da će varijable tablice biti zaključane i zahtijevati manje resursa za vođenje dnevnika.

Nedostaci varijabli tablice u MS SQL Serveru

  • Upiti koji modificiraju TABLE varijable ne kreiraju paralelne planove upita;
  • TABLE varijable nemaju statistiku distribucije i ne pokreću rekompilaciju, pa se preporučuje da se koriste za mali broj redova;
  • Tabelarne varijable se ne mogu mijenjati nakon što su kreirane;
  • Varijable tablice se ne mogu kreirati korištenjem naredbe SELECT INTO;
  • TABLE varijable se ne mijenjaju tokom vraćanja transakcija unatrag jer imaju ograničen opseg i nisu dio trajnih baza podataka.

Primjeri korištenja varijabli tablice u Microsoft SQL Serveru

Pređimo sada na praksu, a prvo bih želeo da napomenem da je moj server Microsoft SQL Server 2016 Express, drugim rečima, svi upiti ispod su pokrenuti na ovoj verziji DBMS-a.

Prvo, napravimo probnu tabelu i popunimo je testnim podacima da vidimo kako se varijable tabele mogu koristiti sa regularnim tabelama.

CREATE TABLE TestTable(ProductId INT IDENTITY(1,1) NOT NULL, ProductName VARCHAR(50) NULL CONSTRAINT PK_TestTable PRIMARNI KLJUČ SKUPOVAN (ProductId ASC)) IDE INSERT INTO TestTable (ProductName) VALUES), ("Computer") ("Monitor") , ("Štampač") IDI SELECT * FROM TestTable


Koristio sam naredbu CREATE TABLE da kreiram tabelu TestTable, zatim sam koristio naredbu INSERT zajedno sa konstruktorom vrednosti tabele VALUES za dodavanje podataka u tabelu, zatim sam koristio naredbu SELECT za odabir iz novokreirane tabele.

Deklarisanje varijable tabele i njeno korišćenje

U ovom primjeru ćemo deklarirati varijablu tablice, dodati joj podatke i napraviti odabir iz dvije tablice ( tabela promenljiva i obična tabela) sa sindikatom.

Deklarisanje varijable tabele DECLARE @TableVar TABLE(ProductId INT NOT NULL, Price MONEY NULL);


--Dodavanje podataka u varijablu tabele INSERT INTO @TableVar (ProductId, Price) VRIJEDNOSTI (1, 500), (2, 300), (3, 200) --Korišćenje varijable tabele sa spajanjem podataka SELECT TTable.ProductId, TTable .ProductName , TVar.Price FROM @TableVar TVar LEFT JOIN TestTable TTable ON TVar.ProductId = TTable.ProductId

Kreiranje varijable tablice s primarnim ključem, UNIQUE ograničenjem i neklasteriranim indeksom Ovaj primjer pokazuje kako možete kreirati primarni ključ, UNIQUE ograničenja i neklasterirane indekse na varijablama tablice. Od tada je dostupna mogućnost kreiranja neklasterisanog indeksa Microsoft verzije

SQL Server 2014.


Deklaracija varijable tabele DECLARE @TableVar TABLE(ProductId INT NOT NULL PRIMARY KEY, --Primarni ključ ProductName VARCHAR(50) NOT NULL, Price MONEY NOT NULL, UNIQUE (ProductName, Price), --Constraint INDEX IX_TableVar (Price) Neklasterirani indeks);

--Dodavanje podataka u varijablu tabele INSERT INTO @TableVar (ProductId, ProductName, Price) VRIJEDNOSTI (1, "Računar", 500), (2, "Monitor", 300), (3, "Printer", 200); --Odabir podataka SELECT ProductName FROM @TableVar GDJE Cijena > 200- Ovim završavam svoju priču o varijablama tablica, ako želite detaljno proučiti T-SQL jezik, preporučujem da pročitate moju knjigu “The T-SQL Programmer’s Way”, nadam se da vam je materijal bio koristan, ćao!

Programiranje uključeno

T

SQL

T-SQL sintaksa i konvencije Pravila za generiranje identifikatora Svi objekti u SQL Serveru imaju imena (identifikatore). Primjeri objekata su tabele, pogledi, pohranjene procedure itd. Identifikatori mogu imati do 128 znakova, uključujući slova, _@$# i brojeve.

Prvi znak uvijek mora biti abecedni. Varijable i privremene tabele koriste posebne šeme imenovanja. Ime objekta ne može sadržavati razmake i ne može biti isto kao rezervirano

ANSI SQL standard zahtijeva da se tačka-zarez stavi na kraj svake izjave. Međutim, kada se programirate u T-SQL-u, tačka-zarez nije potrebna.

Komentari

T-SQL jezik dozvoljava dva stila komentara: ANCI i C. Prvi od njih počinje sa dvije crtice i završava se na kraju reda:

Ovo je komentar u ANSI stilu u jednom redu

Komentari u stilu ANSI se također mogu umetnuti na kraj naredbenog reda:

SELECT CityName – izdvojene kolone

IZ Grada – izvorna tabela

GDJE IdCity = 1; -- granica linije

SQL editor može primijeniti i ukloniti komentare na sve odabrane redove. Da biste to uradili, izaberite odgovarajuće komande u meniju Uredi ili na traci sa alatkama.

Komentari u stilu C počinju kosom crtom naprijed i zvjezdicom (/*) i završavaju istim znakovima obrnutim redoslijedom. Ovaj tip komentara najbolje se koristi za komentiranje blokova linija, kao što su zaglavlja ili veliki testni upiti.

višelinijski

komentari

Jedna od glavnih prednosti komentara u C stilu je da mogu pokrenuti upite u više redaka čak i bez dekomentiranja.

T-SQL paketi

Upit je jedna T-SQL izjava, a grupa je njihov skup. Čitav niz instrukcija u paketu se šalje serveru iz klijentskih aplikacija kao jedna čvrsta jedinica.

SQL Server tretira cijeli paket kao jedinicu rada. Prisustvo greške u barem jednoj instrukciji će onemogućiti izvršavanje cijelog paketa. Istovremeno, raščlanjivanje ne provjerava imena objekata i shema, jer se sama šema može promijeniti tokom izvršavanja instrukcije.

Datoteka SQL skripte i prozor Query Analyzer mogu sadržavati više paketa. U ovom slučaju, svi paketi dijele terminator ključne riječi. Podrazumevano, ova ključna riječ je GO i mora biti jedina na liniji. Svi ostali znakovi (čak i komentari) neutraliziraju graničnik paketa.

Otklanjanje grešaka T-SQL

Kada SQL editor naiđe na grešku, prikazuje prirodu greške i broj reda u grupi. Dvoklikom na grešku možete skočiti direktno na odgovarajući red.

Uslužnom programu za upravljanje Studio verzija SQL Server 2005 ne uključuje program za otklanjanje grešaka T-SQL jezika - uključen je u paket Visual Studio.

SQL Server nudi nekoliko naredbi koje olakšavaju otklanjanje grešaka u paketima. Konkretno, naredba PRINT šalje poruku bez generiranja skupa rezultata. Naredba PRINT može se koristiti za praćenje napretka paketa. Kada je Query Analyzer u načinu rada mreže, pokrenite sljedeću grupu:

SELECT CityName

IZ Grada

GDJE IdCity = 1;

PRINT "Checkpoint" ;

Rezultirajući skup podataka će biti prikazan u mreži i sastojat će se od jednog reda. Istovremeno će se na kartici Poruke prikazati sljedeći rezultat:

(obrađeno redova: 1)

Checkpoint

Varijable

T-SQL varijable se kreiraju pomoću naredbe DECLARE, koja ima sljedeću sintaksu:

DECLARE @Variable_NameData_Type [,

@Variable_NameData_Type, ...]

Sva imena lokalnih varijabli moraju početi sa simbolom @. Na primjer, da deklarirate lokalnu varijablu UStr koja pohranjuje do 16 Unicode znakova, možete koristiti slijedeća uputstva:

DECLARE @UStr varchar (16)

Koristi se za varijabilni tipovi podaci potpuno odgovaraju onima koji postoje u tabelama. Jedna naredba DECLARE može navesti više varijabli odvojenih zarezima. Konkretno, sljedeći primjer kreira dvije cjelobrojne varijable a i b:

DECLARE

@aint ,

@b int

Opseg varijabli (tj. njihov životni vijek) se proteže samo na trenutni paket. Po defaultu, novokreirane varijable su prazne NULL vrijednosti i mora biti inicijaliziran prije nego što se uključi u izraze.

Postavljanje varijabilnih vrijednosti

Trenutno, SQL jezik pruža dva načina za postavljanje vrijednosti varijable - u tu svrhu možete koristiti izraz SELECT ili SET. U smislu funkcionalnosti, ovi izrazi rade gotovo identično, osim što naredba SELECT omogućava da dobijete originalnu vrijednost dodjele iz tablice navedene u SELECT izrazu.

Naredba SET se obično koristi za postavljanje vrijednosti varijabli u obliku koji se češće nalazi u proceduralnim jezicima. Tipični primjeri upotrebe ovog operatora uključuju sljedeće:

SET @a = 1;

SET @b = @a * 1.5

Imajte na umu da svi ovi izrazi izvode direktne operacije dodjeljivanja, bilo koristeći eksplicitne vrijednosti ili druge varijable. Ne možete koristiti naredbu SET za dodjelu vrijednosti varijabli koja se preuzima upitom; upit se mora izvršiti zasebno i tek nakon toga se rezultat može dodijeliti pomoću naredbe SET. Na primjer, pokušaj izvršenja takve naredbe uzrokuje grešku:

DECLARE @c int

SET @c = COUNT (*) IZ Grada

SELECT @c

i sljedeća naredba se izvršava prilično uspješno:

DECLARE @c int

SET @c = (ODABIR BROJ (*) IZ Grada)

SELECT @c

Naredba SELECT se obično koristi za dodjelu vrijednosti varijablama kada je izvor informacija koje treba pohraniti u varijablu upit. Na primjer, radnje koje se izvode u kodu iznad se mnogo češće implementiraju pomoću SELECT naredbe:

DECLARE @c int

SELECT @c = COUNT (*) IZ Grada

SELECT @c

Imajte na umu da je ovaj kod malo jasniji (naročito je sažetiji, iako radi iste stvari).

Stoga je moguće formulirati sljedeću općenito prihvaćenu konvenciju za korištenje oba operatora.

Naredba SET se koristi kada treba izvršiti jednostavnu operaciju dodjele varijabli, tj. ako je dodeljena vrednost već data eksplicitno u obliku određene vrednosti ili u obliku neke druge varijable.

  • Naredba SELECT se koristi kada se dodjela vrijednosti varijabli mora temeljiti na upitu.

Korištenje varijabli u SQL upitima

Jedno od korisnih svojstava T-SQL-a je da se varijable mogu koristiti u upitima bez potrebe za kreiranjem složenih dinamičkih stringova koji ugrađuju varijable u programski kod. Dinamički SQL i dalje postoji, ali se jedna vrijednost može lakše promijeniti - korištenjem varijable.

Gdje god se izraz može koristiti u upitu, može se koristiti i varijabla. Sljedeći primjer pokazuje upotrebu varijable u klauzuli WHERE:

DECLARE @IdProd int ;

SET @IdProd = 1;

SELECT

IZ proizvoda

WHERE IdProd = @IdProd;

Globalne sistemske varijable

SQL Server ima preko trideset globalnih varijabli bez parametara koje su definirane i održavane od strane sistema. Sve globalne varijable imaju prefiks sa dva znaka @. Možete izdvojiti vrijednost bilo kojeg od njih jednostavnim SELECT upit, kao u sljedećem primjeru:

SELECT @@CONNECTIONS

Ovo koristi globalnu varijablu @@CONNECTIONS za preuzimanje broja veza sa SQL Serverom od pokretanja programa.

Među najčešće korištenim sistemskim varijablama su sljedeće:

  • @@ERROR - Sadrži broj greške koja se dogodila prilikom izvršavanja posljednje T-SQL naredbe na trenutnoj vezi. Ako nije otkrivena greška, sadrži 0. Vrijednost ove sistemske varijable se resetuje nakon izvršenja svakog uzastopnog izraza. Ako želite da sačuvate vrednost sadržanu u njoj, onda ovu vrednost treba preneti u lokalnu varijablu odmah nakon izvršavanja naredbe za koju treba pohraniti kod greške.
  • @@IDENTITY - Sadrži zadnju vrijednost identiteta umetnutu u bazu podataka kao rezultat posljednje INSERT izraza. Ako posljednji INSERT izraz nije proizveo vrijednost identiteta, sistemska varijabla @@IDENTITY sadrži NULL. Ova izjava ostaje istinita čak i ako je nedostajuća identifikacijska vrijednost uzrokovana padom tokom izvršavanja izraza. A ako se višestruke operacije umetanja izvode korištenjem jedne naredbe, samo posljednja identifikacijska vrijednost se dodjeljuje ovoj sistemskoj varijabli.
  • @@ROWCOUNT - Jedna od najčešće korištenih sistemskih varijabli. Vraća informacije o broju redova na koje utječe posljednji izraz. Obično se koristi za praćenje grešaka koje nisu klasifikovane kao greške u toku izvođenja. Na primjer, ako program otkrije da nakon pozivanja naredbe DELETE s klauzulom WHERE, broj redova na koje se to odnosi je nula, tada možemo zaključiti da se dogodilo nešto neočekivano. Poruka o grešci se tada može aktivirati ručno.

! Treba napomenuti da se od SQL Servera 2000 globalne varijable nazivaju funkcijama. Naziv global zbunio je korisnike, navodeći ih da misle da je opseg takvih varijabli širi od opsega lokalnih. Globalne varijable su često pogrešno pripisivane sposobnosti pohranjivanja informacija, bez obzira da li su one uključene u paket ili ne, što, naravno, nije bilo tačno.

Kontrole toka komandi. Softverske konstrukcije

T-SQL jezik pruža većinu klasičnih proceduralnih sredstava za kontrolu napretka izvršavanja programa, uklj. kondicionale i petlje.

OperaterIF. . . ELSE

IF izjave. . .ELSE-ovi rade u T-SQL-u u osnovi na isti način kao iu bilo kojem drugom programskom jeziku. Opća sintaksa ovog operatora je sljedeća:

IF Logički izraz

SQL izraz I BEGIN Blok SQL izraza END

SQL izjava | POČNI blok SQL izraza END]

As logički izraz Gotovo svaki izraz se može specificirati, čiji rezultat rezultira vraćanjem Booleove vrijednosti.

Treba uzeti u obzir da se samo naredba koja slijedi odmah iza IF naredbe (najbliža mu) smatra izvršenom prema uvjetu. Umjesto jednog izraza, možete obezbijediti uslovno izvršenje nekoliko izraza tako što ćete ih kombinovati u blok koda pomoću konstrukcije BEGIN...END.

U donjem primjeru, IF uslov se ne izvršava, što sprečava da se izvrši naredba koja ga prati.

AKO 1 = 0

ŠTAMPA "Prva linija"

ŠTAMPA "Drugi red"

Opciona naredba ELSE vam omogućava da specificirate izraz koji će se izvršiti ako IF uvjet nije zadovoljen. Kao i IF, izraz ELSE kontrolira samo sljedeću naredbu ili blok koda između BEGIN...END.

Iako se naredba IF čini ograničenom, njena uvjetna klauzula može uključivati ​​moćne karakteristike, slične klauzuli WHERE. Konkretno, ovo su naredbe IF EXISTS().

Izraz IF EXISTS() koristi kao uslov prisustvo bilo kojeg reda koji vraća SELECT izraz. Pošto se pretražuju bilo koji redovi, lista stupaca u SELECT izrazu može se zamijeniti zvjezdicom. Ova metoda je brža od provjere @@ROWCOUNT>0 uvjeta jer ne zahtijeva brojanje ukupnog broja redova. Čim barem jedan red zadovolji uslov IF EXISTS(), upit može nastaviti s izvršavanjem.

Sljedeći primjer koristi izraz IF EXISTS za provjeru da li ID kupca 1 ima narudžbe prije nego što ga ukloni iz baze podataka. Ako postoji informacija o barem jednoj narudžbi za ovog klijenta, brisanje se ne vrši.

AKO POSTOJI (ODABIR * OD GDJE IdCust = 1)

PRINT "Klijenta je nemoguće izbrisati jer postoje zapisi povezani s njim u bazi podataka"

ELSE

GDJE IdCust = 1

PRINT "Uklanjanje je uspješno završeno"

OperateriDOK, BREAK iNASTAVI

Naredba WHILE u SQL-u radi na isti način kao i na drugim jezicima s kojima programer obično radi. U suštini, ova izjava provjerava neki uvjet prije svake iteracije kroz petlju. Ako, prije sljedećeg prolaska kroz petlju, provjera uvjeta rezultira primanjem vrijednosti TRUE, petlja je propuštena, inače je izvršenje naredbe završeno.

Naredba WHILE ima sljedeću sintaksu:

WHILE Boolean izraz

SQL izjava I

Blok SQL izraza

Naravno, možete koristiti naredbu WHILE da osigurate da se samo jedna naredba izvršava u petlji (slično kako se tipično koristi IF izraz), ali u praksi izjave WHILE koje ne prati BEGIN blok. . .END koji odgovara punom formatu iskaza je rijedak.

Naredba BREAK vam omogućava da odmah izađete iz petlje bez čekanja dok se kraj petlje ne završi i uvjetni izraz se ponovo testira.

Naredba CONTINUE vam omogućava da prekinete jednu iteraciju petlje. Učinak operatora CONTINUE može se ukratko opisati na način da omogućava prijelaz na početak WHILE petlja. Čim se naredba CONTINUE nađe u petlji, bez obzira na to gdje se nalazi, vraća se na početak petlje i ponovo procjenjuje uslovni izraz (a ako uslovni izraz više nije TRUE, petlja izlazi).

Sljedeća kratka skripta pokazuje korištenje WHILE naredbe za kreiranje petlje:

DECLARE @Temp int ;

SET @Temp = 0;

WHILE @Temp< 3

POČNI

PRINT @Temp;

SET @Temp = @Temp + 1;

Ovdje, u petlji, cjelobrojna varijabla @Temp se povećava sa 0 na 3 i pri svakoj iteraciji njena vrijednost se prikazuje na ekranu.

OperaterRETURN

Naredba RETURN se koristi za zaustavljanje izvršavanja paketa, a samim tim i pohranjene procedure i okidača (pokriveno u budućim laboratorijama).