by martin
1. May 2009 16:00
Det er sikkert kendt for de fleste hvor vigtigt det er at dine datatyper matcher når du skriver T-SQL, for på den måde at undgå inplicit konverting af dine værdier. Det som afgør hvilken datatype som er den stærkste er “Data Type Precedence” – som man kan se ud fra reglerne er at hvis man forsøge at matche en int med en varchar, vil SQL-Server forsøge at konverte varchar’en til en integer.
Jeg har set det SÅ mange gange, at disse konverteringer, som man ikke er klar over, er skyld i at ens SQL kører langsomt.
Når man så kender disse regler, og hvad der sker / ikke sker af konverteringer kan man så godt komme ud for nogle sjove / uforklarlige ting. Jeg fandt følgende lille snip i en NG, gættede uden at teste det, og tog selvfølgelig fejl. Derefter testede jeg det med nedenstående eksempel, og fik faktisk en lille overraskelse – og jeg har stadig lidt svært ved at finde en fornuftig forklaring på dette:
use tempdb
declare @a dec(5,2) = 123.45
declare @b dec(5,2) = 123.34
select @a / @b as c into dbo.t666
Hvilken datatype får kolonnen c i tabellen t666 ? Uden at ville afsløre det syntes jeg det er lidt overraskende, er der nogen som kan forklare hvorfor C ender op med den type som den faktisk gør ? Kommentarer og forklaringer modtages MEGET gerne.