Bizzarie del parser di SQL Server?
Da lunedì scorso sono a Genova a tenere il corso "Implementing a Microsoft SQL Server 2008 Database" a un simpatico gruppo di genovesi. E tra un piatto di "tortellini burro e salvia" .. e un'esercitazione, oggi una partecipante ha sollevato un piccola anomalia che va probabilmente addebitata al parser di SQL Server. Dove il problema?
Il problema sta nel fatto che il parser NON si accorge dell'errore e per giunta mi esegue la procedura senza la clausola OUTPUT. Da notare che il tasto dei due-punti (:) è molto vicino a quello del punto-e-virgola (;), quindi è molto facile che l'errore di digitazione avvenga.
Un esempio riproducibile:
use
tempdb
go
/* T-SQL 2008 */
if
object_id('dbo.t1', N'U') is not null
drop table dbo.t1
go
create
table t1 (
pkey
int primary key,col1 char(1)
)
go
insert
t1 values (1, 'A'), (2, 'B'), (3, 'C')
go
if
object_id('dbo.stp_get_col1') is not null
drop proc dbo.stp_get_col1
go
create
proc stp_get_col1 (@pkey int,
@col1
char(1) OUTPUT
)
as
select
@col1 = col1
from
t1
where
pkey = @pkey
return
go
declare
@col1 char(1) = '';
--qui i due punti vanificano la presenza della OUTPUT
exec
stp_get_col1 1, @col1 OUTPUT:
select
@col1 as col1;
--qui il punto-e-virgola segna correttamente
--la fine della frase T-SQL
exec
stp_get_col1 1, @col1 OUTPUT;
select
@col1 as col1;
go
Ho aperto un commento su Connect.Microsoft. Non sarà il bug del millennio, ma l'idea che un banale errore di digitazione (..accompagnato da un mancato unit test...) mi mandi all'aria l'esecuzione di una stored, non mi piace mooooltissimo.