Università di Modena e Reggio Emilia Basi di dati (6) Docente: andrea.bulgarelli@gmail.com Argomento: T-SQL (1.0) 1
Panoramica T-SQL Variabili Controllo di flusso Trattamento errori Print Operatori e funzioni speciali 2
T-SQL Il T-SQL (Transact-SQL) è l estensione dell SQL standard prevista da Microsoft 3
T-SQL variabili T-SQL dispone unicamente di variabili locali (disponibili nel batch o stored procedure in cui vengono dichiarate) Le variabili hanno tutte obbligatoriamente un tipo associato Le variabili devono essere dichiarate all inizio del batch o procedura: DECLARE @nomevar tipo [, @nomevar2 tipo2 [, ]] I valori delle variabili sono assegnati principalmente in due modi: SET @nomevar = valore SELECT @nomevar = valore [,.] 4
T-SQL variabili (2) Una SET può assegnare una sola variabile declare @v int set @v = 10 print @v Una singola SELECT può assegnare molti valori ad altrettante variabili L assegnazione tramite SELECT deve essere curata in modo da garantire che qualsiasi esecuzione della SELECT produca esattamente un valore per ciascuna variabile Se una SELECT produce più valori, alla fine dell esecuzione l assegnazione a ciascuna variabile riflette l ultimo valore assegnato Se una SELECT non produce alcun valore, allora la variabile mantiene il valore assunto in precedenza declare @cf char(16) select @cf = CF from Cliente print @cf 5
T-SQL variabili (3) Se si accetta un valore (magari qualsiasi tra più valori disponibili), allora si può usare SELECT TOP 1, possibilmente integrato con ORDER BY Si può anche verificare il valore @@ROWCOUNT dopo l esecuzione ed attivare una routine di errore se il valore è maggiore di 1 6
T-SQL variabili (4) L assegnazione di variabili può essere usata anche nel contesto di un UPDATE Esempio: declare @intcounter int set @intcounter = 0 update Yaks SET @intcounter = YakSequenceNumber = @intcounter + 1 Sono disponibili molte funzioni di sistema (ad esempio @@spid), che per motivi storici hanno il nome preceduto da @@ e vengono talvolta indicate come variabili globali 7
Esempio USE pubs GO DECLARE @cost money SELECT @cost = price FROM titles WHERE title_id = 'bu1032' SET context_info @cost GO SELECT convert(money,substring(context_info,1,8)) FROM master..sysprocesses WHERE spid = @@spid 8
T-SQL controllo di flusso Il controllo di flusso viene realizzato mediante alcuni costrutti Definizione di un blocco di istruzioni BEGIN statements END Criteri di esecuzione condizionale IF.ELSE Criteri di esecuzione multivia CASE WHEN THEN. ELSE Trasferimento di esecuzione (non usare, se possibile) GOTO Termine dell esecuzione e ritorno di un valore al chiamante RETURN Ciclo di esecuzione WHILE BREAK CONTINUE 9
T-SQL: IF - ELSE IF ( SELECT AVG(price) FROM titles WHERE type = 'mod_cook' ) < $15 BEGIN PRINT 'The following titles are excellent mod_cook books:' PRINT ' ' SELECT SUBSTRING(title, 1, 35) AS Title FROM titles WHERE type = 'mod_cook' END ELSE PRINT 'Average title price is more than $15.' 10
T-SQL: CASE SELECT Category = CASE type WHEN 'popular_comp' THEN 'Popular Computing' WHEN 'mod_cook' THEN 'Modern Cooking' WHEN 'business' THEN 'Business' WHEN 'psychology' THEN 'Psychology' WHEN 'trad_cook' THEN 'Traditional Cooking' ELSE 'Not yet categorized' END, CAST(title AS varchar(50)) AS 'Shortened Title', price AS Price FROM titles WHERE price IS NOT NULL ORDER BY type, price COMPUTE AVG(price) BY type 11
T-SQL: WHILE Costrutto di base per l esecuzione di cicli in T- SQL Al suo interno una istruzione BREAK causa l uscita immediata dal WHILE più interno che lo circonda Una istruzione CONTINUE implica la terminazione immediata del ciclo corrente del WHILE e l inizio del ciclo successivo DECLARE @counter int SET @counter=1 WHILE (@counter <= 1000) BEGIN INSERT xyz DEFAULT VALUES SET @counter=@counter+1 END 12
T-SQL: RETURN Terminazione incondizionata del codice Opzionalmente può ritornare un valore RETURN n che viene passato al chiamante come esito Usato tipicamente in stored procedures e triggers Può essere usato anche altrove per gestire la terminazione 13
T-SQL: print PRINT 'Hello world' -- output come stringa SELECT 'Hello world' -- output come rowset PRINT 'Data: ' + getdate() -- errore di conversione PRINT 'Data: ' + convert(char(30),getdate ()) 14
T-SQL: raiserror Invia messaggi al client Accetta parametri printf-like Meglio usare questo invece del print RAISERROR ( {msgid msgstr}, severity, state [, args] ) [WITH LOG] Dopo la chiamata, @@ERROR contiene il msgid Severity: Messaggio informativo: 0 o 10 severity 15 warnings, severity 16 errors Errore 20, fatal, disconnessione State: non ha rilevanza. Va bene un numero da 1 a 127 15
T-SQL: raiserror (4) Esempio. E possibile creare dei messaggi predefiniti con un numero univoco. (#6x, visualizza il numero in esadecimale) EC sp_addmessage 50001, 10, 'Hello World, from: %s, process id: %#6x', @replace='replace' DECLARE @parm1 varchar(30), @parm2 int SELECT @parm1=user_name(), @parm2=@@spid RAISERROR(50001, 15, -1, @parm1, @parm2) 16
T-SQL operatori Operatori aritmetici (+ - * / % (modulo) ) (tipi numerici) Operatori bitwise (& and or ^ exor ~ not) (su int) Operatori confronto (= > < >= <= <>) Operatori logici (AND OR NOT) Ordine di precedenza (decrescente) ~ (not bitwise) * / % + - ^ (exor bitwise) & (and bitwise) (or bitwise) NOT AND OR 17
Esempio sui tipi (casting) CREATE TABLE test (a sql_variant,b sql_variant) GO INSERT INTO test VALUES (CAST (111 as int), CAST(222 as money)) GO INSERT INTO test VALUES (CAST (333 as int), CAST(444 as char(3))) GO SELECT * FROM test WHERE a > b Result: a b ---- ---- 333 444 18
T-SQL funzioni Funzioni per la conversione: CONVERT, CAST, STR Funzioni data e ora: DATEADD, DATEDIFF, DATENAME, DATEPART, DAY, MONTH, YEAR, GETDATE, GETUTCDATE Funzioni matematiche Funzioni di manipolazione di stringhe Funzioni di sistema e informazione metadati Altre funzioni (@@ ) 19