Enjoy Your SQL Bizzarie del parser di SQL Server? - Francesco Quaratino

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?

  • scrivete una execute di una stored procedure che come ultimo parametro presenta un parametro di OUTPUT
  • terminate la frase con i due-punti (:)

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.

 

Comments

No Comments