Adatbázisok szerver oldali programozása Előadás, 2006.04.21.

A VIK Wikiből
(AdatbServerProgJegyzet20060421 szócikkből átirányítva)
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor kérlek javíts rajta egy rövid szerkesztéssel.

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót


<style> code.pre { white-space: pre; display: block; mergin-top: 2px; margin-bottom: 2px; } code.precompact { white-space: pre; display: block; mergin-top: 2px; margin-bottom: 2px; line-height:13px; } li { line-height: 18px; } </style>


<< Előadás, 2006.04.21. >>

Microsoft SQL Server bevezetés

Rendszer objektumok és kapcsolataik

+------= * +-----------+ * +-------------+= | példány |-------|| adatbázis ||-------|| felhasználó |} +------= +-----------+ +-------------+=

Rendszer adatbázisok

  • Master: rendszer szintű információk
    • SQL init adatok
    • többi adatbázis helye
  • TempDB: átmeneti táblák és tárolt eljárások
  • Model: ez alapján jön létre egy új adatbázis
  • MSDB: SQL Server Agent használja
    • figyelmeztetések
    • munkák ütemezése

adat file: *.mdf, *.ndf
log file: *.ldf

A rendszer szintű információkat az =sp_= kezdetű tárolt eljárásokkal lehet lekérdezni és müdosítani.

Identity

Kulcsgeneráló objektum. 1 táblának legfeljebb 1 identity oszlopa lehet.

CREATE TABLE anyag ( anyag_id INT IDENTITY PRIMARY KEY, anyag_nev VARCHAR(50) NOT NULL, lejar DATETIME )

Megadható a kulcs kezdőértéke és növekménye is: =IDENTITY(start, incr)=. Default érték: 1-től indul és egyesével nő.

  • Beszúrás generált kulccsal: =INSERT INTO anyag VALUES ('cukor', NULL)=
  • Beszúrás felhasználó által definiált kulccsal: SET IDENTITY_INSERT anyag ON


INSERT INTO anyag(anyag_id, anyag_nev) VALUES(2, 'liszt')
SET IDENTITY_INSERT anyag OFF
Az =INSERT= utasításon belül ilyenkor kötelező felsorolni az oszlopokat.

  • Session utoljára generált kulcsának lekérdezése (globális változó, nem táblafüggő): =SELECT @@IDENTITY=
  • Adott táblába utoljára beszúrt kulcs: =IDENT_CURRENT(táblanév)=
  • Identity kezdeti beállításainak lekérdezése: =IDENT_SEED(táblanév)=, =IDENT_INCR(táblanév)=

SQL Server programozása

A szerver Transact-SQL (T-SQL) nyelven programozható. A végrehajtás batchenként történik, a batcheket =GO= utasítás zárja le. Az utasítások végére nem kell pontosvessző.

Komment

  • egysoros: =--=
  • többsoros: =/* */=, egymásba ágyazható (az Oracle-ben nem)

Azonosítók

  • Szabályos: ([A-Z0-9_]|@{1,2}#{1,2})[A-Z0-9_$]*
    • =@=: lokális változó vagy paraméter
    • =@@=: rendszerváltozó vagy -függvény
    • =#=: átmeneti tábla vagy eljárás
    • =##=: globális átmeneti tábla vagy eljárás
  • Delimited: [ ] vagy " " jelek közé kell írni, speciális karaktereket is tartalmazhat
  • Deklaráció: =DECLARE @változónév típus, @változónév típus, ...=


Alapértéket nem lehet megadni, a változók

NULL

-ra inicializálódnak. Változó bárhol deklarálható, nem csak blokk elején.

  • Értékadás:
    • =SET @a = 5=
    • =SET @a = (SELECT ...)=. A =SELECT= 0 vagy 1 soros és 1 oszlopos eredménnyel kell, hogy visszatérjen, különben hiba történik. Ha 0 sorral tér vissza, a változó =NULL= értéket kap.
    • =SELECT @a=oszlop1, @b=oszlop2, ... FROM ...=


Ha a =SELECT= 0 sorral tér vissza,

NULL

-t vesz föl minden változó, több soros eredmény esetén az utolsó sor mezői kerülnek a változókba. A legutolsó SQL utasítás által érintett sorok számát a =@@ROWCOUNT= változó adja vissza.

Adattípusok

  • Egészek
    • =BIGINT=: 64 bit, előjeles
    • =INT=: 32 bit, előjeles
    • =SMALLINT=: 16 bit, előjeles
    • =TINYINT=: 8 bit, előjel nélküli
    • =BIT=: 0 vagy 1 értékű
  • Fixpontos
    • =DECIMAL=, =NUMERIC=: legfeljebb 38 jegyű
    • =MONEY=, =SMALLMONEY=
  • Lebegőpontos
    • =FLOAT=: 8 byte-os lebegőpontos, 15 számjegy pontosságú
    • =REAL=: 4 byte-os lebegőpontos, 7 számjegy pontosságú
  • Dátum
    • =DATETIME=: 1753. január 1. és 9999. december 31. közötti időpontot tárol
    • =SMALLDATETIME=: 1900. január 1. és 2079. január 6. közötti időpontot tárol
    • Elfogadott dátum formátumok: ='mm/dd/yyyy'=, ='mm-dd-yyyy'=, ='yyyy-mm-dd'=, stb.
    • a =SET DATEFORMAT= utasítással egyéb formátumokban is beolvasható a dátum
  • String
    • =CHAR=, =VARCHAR=: <=8000 byte-os fix/változó hosszúságú string
    • =NCHAR=, =NVARCHAR=: <=8000 byte-os (4000 karakteres) fix/változó hosszúságú unicode string
    • =TEXT=, =NTEXT=: <=2 GB hosszú string, a string műveletek nem alkalmazhatók rá
    • =VARCHAR(MAX)=, =NVARCHAR(MAX)=: <=2 GB hosszú string, string függvények alkalmazhatók rá, az SQL Server 2005-ben jelentek meg.
    • =BINARY=, =VARBINARY=: <=8000 byte-os fix/változó hosszúságú bináris string
    • =IMAGE=: <=2 GB-os bináris string
  • Egyéb
    • =BOOLEAN=: implicit típus, csak kifejezésben lehet használni, nem lehet oszlopnak vagy változónak értékül adni
    • =CURSOR=
    • =SQL_VARIANT=: típus nélküli változó
    • =TABLE=: eredményhalmazt tárol későbbi feldolgozásig
    • =TIMESTAMP=
    • =UNIQUEIDENTIFIER=: globálisan egyedi azonosító
    • =XML=

Típus precedencia

Ha egy operátor 2 oldalán különböző típusok állnak, az eredmény a magasabb precedenciájú típus lesz.

SQL_VARIANT= > =DATETIME= > =SMALLDATETIME= > =FLOAT= > =REAL= > =DECIMAL= > =MONEY= > =SMALLMONEY= > =BIGINT= > =INT= > =SMALLINT= > ... > =NVARCHAR= > =VARCHAR= > =CHAR

A fenti precedencia sor következménye pl. az, hogy stringet és számot csak típuskonverzió után lehet összefűzni. Castolni a =CONVERT(típusnév[(paraméterek)], érték)= függvénnyel lehet. Pl. =CONVERT(numeric(10,2), 1.23456)=

Operátorok

egy operandusú műveletek: =+=, =-=, =~=

operátor precedencia:

1 =+ - ~= előjel 2 =* / %= 3 =+ -= additív és összefűző 4 =< > ...= 5 =^ & |= 6 =NOT= 7 =AND= 8 =ALL ANY= 9 =SET=

Batch

Def.:

amit egyszerre küldünk a szervernek, utasítások sorozata

Kliens:

  • Query Analyzer (2000)
  • Management Studio (2005)

Blokk:

batch vagy =BEGIN ... END=

Vezérlési szerkezetek

Feltételes utasítások

IF bool_kif utasítás ELSE utasítás

  • több utasítás esetén =BEGIN END= közé kell tenni

IF (bool értékű SQL utasítás) utasítás ELSE utasítás

Pl.:
IF (EXISTS (SELECT * FROM anyag))
  print('nem üres')
ELSE
  print('üres')
  • =THEN= és =ELSE= ágban ugyan arra a táblára kell vonatkoznia a =CREATE TABLE= ill. a =SELECT= utasításoknak

Ciklus

WHILE bool_kifejezés utasítás

  • kilépes: =BREAK=
  • folytatás: =CONTINUE=

Ugrás

GOTO címke

  • címke def.: =cimke:=
  • =RETURN=

Várakozás

WAIT FOR {DELAY idő | TIME időpont}

Case függvény

CASE bemeneti kif.
	WHEN kif. THEN kif.
	...
	[ELSE kif.]
END
Pl.:
SELECT CASE egyseg_nev
			 WHEN 'l' THEN 'liter'
			 WHEN 'dl' THEN 'deci'
			 ELSE egyseg_nev
		 END egysnev
FROM anyag
ORDER BY egysnev
  • ha nem, tud illeszteni és nincs ELSE-ág akkor =NULL= lesz az eredmény

Searched case:

CASE 
	WHEN bool_kif THEN kif.
	...
	[ELSE kif.]
END


-- Peti - 2006.04.25. -- Matyi - 2006.07.03.