Dalla versione 7 di SQL Server è possibile usare una istruzione per alterare una stored procedure, ALTER, molto utile per apportare modifiche alle nostre procedure senza doverle ricompilare nuovamente:

USE TEMPDB

GO

ALTER PROCEDURE SP__TEST AS

SELECT * FROM MANAGEMENT WHERE ID > 0

/*

Ovviamente in questo esempio la procedura è inventata

*/

L’esempio ci illustra una grande potenzialità di SQL Server, poter chiamare e gestire chiamate ad oggetti COM presenti sul sistema operativo. Nel nostro caso se avete registrato il componente CDONTS per spedire email ( di default su NT4 Server, no per Windows 98, ME o W2000 professional ) potete create questa store procedure e provare ad inviare una email attraverso SQL Server.

SQL Server usa tre potenti procedure di sistema (scritte in T-SQL) per gestire gli oggetti COM:

1 – sp_OACreate

2 – sp_OAMethod

3 – sp_OADestroy

che permettono di istanziare gli oggetti e richiamarne i metodi.

CREATE PROCEDURE sp_sendmail(

@indirizzo VARCHAR(255),

@messaggio VARCHAR(8000),

@soggetto VARCHAR(255),

@da VARCHAR(255) = ‘mio@indirizzo.it’) AS

DECLARE @CDO INT, @OLEResult INT, @Out INT

–Crea l’oggetto CDONTS.NewMail

EXECUTE @OLEResult = sp_OACreate ‘CDONTS.NewMail’, @CDO OUT

IF @OLEResult <> 0 PRINT ‘CDONTS.NewMail’

–Chiama il metodo send dell’oggetto

EXECUTE @OLEResult = sp_OAMethod @CDO, ‘Send’, NULL, @da, @indirizzo, @soggetto, @messaggio, 0

IF @OLEResult <> 0 PRINT ‘Send’

–Distruggi l’oggetto CDO

EXECUTE @OLEResult = sp_OADestroy @CDO

RETURN @OLEResult

GO

— Esempio per lanciare la procedura

–execute sp_sendmail ‘luca_milan@freeasp.it’,’Prova email per il corso TSQL’,’Email spedita con SQL Server’,’tuo@indirizzo.it’

L’esempio ci illustra un modo per sommare valori di tempo in formato hh:mm (ore:minuti) dalle colonne di una tabella.

–>creo tabella temporanea

create table #t ( hm varchar(5))

insert #t values(‘8:30’)

insert #t values(‘5:45’)

insert #t values(’12:12′)

insert #t values(‘7:20’)

select convert(varchar, sum(datediff(ss, ‘1900-01-01 00:00’, convert(datetime, hm)))/3600) +

‘:’ +

convert(varchar, (sum(datediff(ss, ‘1900-01-01 00:00’, convert(datetime, hm)))%3600)/60)

from #t

–>elimino tabella temporanea

drop table #t

Questa soluzione piuttosto elegante non usa cursori o tabelle temporanee, ma sfrutta la potenza delle tabelle derivate.

USE pubs

GO

–> Prendiamo il nome ed il cognome del 12-13-14 autore dalla tabella authors

select a1.au_fname + ‘ ‘ + a1.au_lname [Nome e Cognome],

(select count(*) from authors a2

where a2.au_lname <= a1.au_lname) [Lista degli autori]

from authors a1

where (select count(*) from authors a2

where a2.au_lname <= a1.au_lname) between 12 and 14

order by a1.au_lname

Assumiamo che SQL SERVER abbia impostato di default la domenica cioè 7 (è il caso del mio SQL Server) il parametro DATEFIRST che indica il primo giorno di della settimana.

–>Set datefirst 7

declare @d datetime, @l datetime

set @d = ’13/06/2001′ –> 13 Giugno 2001

–> Il sistema imposta l’inizio della settimana il:

select @@DATEFIRST as [Primo giorno della settimana] –> 1 lunedì, 2 martedì, … 7 domenica

–> Visualizziamo la data del lunedì della settimana

select dateadd(dd, 2-datepart(dw, @d), @d) as [Lunedì della settima]

L’abbassamento del costo dei dispositivi per la masterizzazione e relativi supporti ha portato a una grande diffusione di quest’ultimi. Spesso […]