Transact SQL ( Einordnung TransactSQL MS-Erweiterung (bei anderen Systemen ähnlich) SQL normierter Standard Datentypen numerische int smallint tinyint bigint decimal(p[,q]) numeric(p[,q]) real float(p) money smallmoney 4 Bytes 2 Bytes 1 Byte 8 Bytes 2-17 Bytes (s.o.) alphanumerische char[(n)] varchar[(n)] nchar[(n)] nvarchar[(n)] text(n)] ntext(n)] 1*n Byte, Länge genau n 1*n Byte, mit Längenfeld, max n 2*n Byte, Unicode, Länge genau n 2*n Byte, max n, Unicode binäre binary([n]) varbinary([n]) image([n]) bit Bitkette, Länge genau n Bitkette, Länge max n Bitkette, für Bilder Datum/Zeit datetime smalldatetime je 4 Bytes je 2 Bytes abgeleitete timestamp sysname weitere cursor uniqueidentifier sql_variant table xml user defined type (UDT) 4 oder 8 Bytes = decimal mit 8 Bytes = decimal mit 4 Bytes Steuerungen BEGIN-Block begin Anweisung1 Anweisung2 … end IF-Anweisung if (select count(*) from person) > 5 print 'grösser 5' else print 'kleiner gleih 5' WHILEAnweisung while (select sum(mittel) from projekt) < 500000 update projekt set mittel=mittel*1.1 Lokale Variablen set @x = 15000 select @durchschnitt = avg(gehalt) from person Weitere Anweisungen return goto marke raiserror waitfor Transaktion begin transaction insert ... -- geht gut insert ... -- Verletzung irgendeiner Bedingung commit transaction AusnahmeBehandlung try begin transaction insert ... -- geht gut insert ... -- Verletzung irgendeiner Bedingung commit transaction print 'erfolgreiche Transaktionsausführung' catch rollback transaction print 'Transaktion zurückgesetzt' end 3 Fälle 1) guter Fall: alle inserts gehen durch create table ... primary key begin transaction insert ... -- geht gut insert ... -- geht gut commit transaction drop table 2) schlechter Fall1: nur mit Transaktion (wird zurückgesetzt) create table ... primary key begin transaction insert ... -- geht gut insert ... -- geht nicht gut, Verletzung des Primärschlüssels commit transaction drop table 3) schlechter Fall2: mit Transaktion und try-catch (zurückgesetzt, Zusatzbehandlung) create table ... primary key Ausnahmetry Behandlung begin transaction insert ... -- geht gut insert ... -- geht nicht gut, Verletzung des Primärschlüssels commit transaction print 'erfolgreiche Transaktionsausführung' catch rollback transaction print 'Transaktion zurückgesetzt' end drop table Prozeduralität in der Datenbank klassisch select jetzt execute update1 update2 ok/not ok insert Vorteile: Performance wg. Übersetzung Kommunikationsreduzierung Mehrfachverwendung Implementierung einer Anwendungs-Schnittstelle über SQL gespeicherte Prozeduren Syntax: create procedure pname (@parm1 typ, parm2 typ, …) as … Beispiele: SQL-Abkürzung create procedure p1 as select … from … where … create procedure p2 as create table e … Ablaufsteuerung create procedure p3 as if (select count(*) from person) = 5 print ‘gleich 5' else print 'ungleich 5' mit Parametern create procedure p4 (@x int) as select … from … where spname = @x Definition und Aufruf create procedure pp execute pp Es gibr sonst noch drop procedure pp alter procedure pp benutzerdefinierte Funktionen Syntax: create function fname (@parm1 typ, parm2 typ, …) returns typ as begin ... return … end 1) Standardtyp: Kontodurchschnitt create function xxx … Aufruf anstelle eines Wertes s. Kontostand als Standardfunktion 2) Tabelle Projektmitarbeiter create function xxx … Aufruf anstelle einer Tabelle s. Kontostand als Tabellenfunktion Beispiele -- Vorbesetzung create procedure p3 as begin create table artikel2 (artikelnr int primary key, artikelname char(10), menge int, nettopreis decimal(7,2)) insert into artikel2 values (11,'Fahrrad',20,400) insert into artikel2 values (12,'Lenker',30,70) insert into artikel2 values (13,'Rahmen',25,120) insert into artikel2 values (14,'Lufrad',45,50.50) select * from artikel2 end -- Prgrammierung if (select count(*) from artikel) > 5 print 'mehr als 5' else print 'weniger oder gleich 5' if (select sum(nettopreis) from artikel2) < 1000 update artikel2 set nettopreis=nettopreis*1.1 while (select sum(nettopreis) from artikel2) < 1000 update artikel2 set nettopreis=nettopreis*1.1 declare @x int set @x = 15000 print @x declare @durchschnitt decimal (7,2) select @durchschnitt = avg(nettopreis) from artikel2 print @durchschnitt --Gute Transaktion: alle inserts gehen durch create table artikel2 (artikelnr int primary key, artikelname char(10), menge int, nettopreis decimal(5,2)) begin transaction insert into artikel2 values (11,'Fahrrad',20,400) -- geht gut insert into artikel2 values (12,'Lenker',30,70) -- geht gut commit transaction select * from artikel2 drop table artikel2 --Alternative: Transaktion wird abgeschlossen oder zurückgesetzt create table artikel2 (artikelnr int primary key, artikelname char(10), menge int, nettopreis decimal(5,2)) begin transaction insert into artikel2 values (11,'Fahrrad',20,400) -- geht gut insert into artikel2 values (11,'Lenker',30,70) -- geht nicht gut if (@@error <> 0) rollback transaction else commit transaction select * from artikel2 drop table artikel2 --andere Alternative: Transaktion wird evtl. zurückgesetzt mit Zusatzbehandlung create table artikel2 (artikelnr int primary key, artikelname char(10), menge int, nettopreis decimal(5,2)) begin try begin transaction insert into artikel2 values (11,'Fahrrad',20,400) -- geht gut insert into artikel2 values (12,'Lenker',30,70) -- geht nicht gut commit transaction print 'erfolgreiche Transaktionsausführung' end try begin catch rollback transaction print 'Transaktion zurückgesetzt' end catch select * from artikel2 --praktische Verwendung SQL-Abkürzung create procedure p1 as Select , nettopreis*1.19 from artikel2 create procedure p2 as create table artikel2 (artikelnr int primary key, artikelname char(10), menge int, nettopreis decimal(5,2)) create procedure p3 as Ablaufsteuerung if (select count(*) from artikel) = 5 print ‘gleich 5' else print 'ungleich 5' mit Parametern create procedure p3 (@x int) as select * from artikel2 where nettopreis <= @x Definition und Aufruf create procedure pp execute pp --Standardfunktionen create function c() returns int as begin return 99 end print dbo.c() create function pd() returns decimal(7,2) as begin declare @du decimal(7,2) select @du = avg(nettopreis) from artikel return @du end print dbo.pd() select * from artikel where nettopreis < dbo.pd() --kontostand als Standardfunktion create function kontostand1(@kundenname char(12), @pin int) returns decimal(9,2) as begin declare @ko decimal(9,2) select @ko = kontostand from kunde2 where kundenname = @kundenname and pin = @pin return @ko end print dbo.kontostand1('Meier',12345) -- Tabellenfunktionen create function bi() returns table as return select * from artikel2 select * from dbo.bi() create function bi2() returns table as return select * from artikel2 where nettopreis < 100 select * from dbo.bi2() create function preis(@anr int) returns decimal(7,2) as begin declare @pr decimal(7,2) select @pr = nettopreis from artikel2 where artikelnr = @anr return @pr end print dbo.preis(11) -- kontostand als Tabellenfunktion create function kontostand2(@kundenname char(12),@pin int) returns table as return select * from kunde2 where kundenname = @kundenname and pin = @pin select * from dbo.kontostand2('Meier',12345) -- im Java-Programm import java.sql.*; public class Kontostand2SQLServer { public static void main(String[] args) throws Exception { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection("jdbc:odbc:sqlserverdb","",""); Statement s = c.createStatement(); // als gespeicherte Tabellenfunktion ResultSet rs = s.executeQuery("select * from dbo.kontostand2('Meier',12345)"); while (rs.next()) { System.out.println(rs.getInt("kontostand")); } c.close(); } } --compute-Klausel select * from artikel2 compute min(nettopreis) Einige Systemprozeduren Bereits fertige gespeicherte Prozeduren auflisten aller eingeloggten Benutzer auflisten aller Objekte der Datenbank hinzufügen von Objekten konfigurieren des Servers anzeigen von Hilfen zu Datenbankobjekten verschicken von e-mails verwalten der Sicherheit z.B. sp_configure sp_help sp_help ‘tabellenname’ sp_helpdb sp_spaceused sp_who xp_cmdshell