Più che di .NET, finisco sempre a parlare di SQL server in questi giorni... ma questo tuning del DB mi sta facendo scoprire un bel po di cosette!

A dire il vero questo problema l'avevo già incontrato un po di tempo fa, ma l'avevo rimosso, ora l'ho ritrovato tra le email e lo ripropongo: come molti di voi sanno, l'ISO 8601 dovrebbe definire uno standard per rappresentare le date in modo da evitare problemi di comprensione ma, soprattutto, di interazione con il fantomatico db.
Purtroppo, quello che ho scoperto è che per SQL server non esiste un vero e proprio formato ISO, ma reinterpreta comunque l'ingresso a seconda dei language settings dell'utente con cui ci si logga nel db! Quindi, se l'utente ha il linguaggio inglese, va tutto bene, se invece ha un linguaggio diverso (tedesco, italiano, russo, etc), sql server reinterpreta il formato e si aspetta YYYY-DD-MM, generando ovviamente un errore di conversione.

Potete anche riprovare voi sul vostro query analyzer questo comportamento con due semplici select su una tabella che abbia un campo data:

SET LANGUAGE english
GO
SELECT * FROM Tabella WHERE Campo = '2005-10-22' --Tutto Ok
GO
SET LANGUAGE italian
GO
SELECT * FROM Tabella WHERE Campo = '2005-10-22' -- Errore di conversione
GO

Questo mi ha particolarmente sconvolto, e mi ha dato una ragione in più per picchiare le mie "scimmie da codice" quando provano a non usare i parameters, ma più che altro è lo sconvolgimento che prevale.
Fin'ora come soluzione cambio i language settings del login con cui entro in SQL server, ma vorrei tanto che qualcuno mi smentisse/mi desse un'altra soluzione (Senza andare a toccare syslanguages :p).