Gæt en Datatype ?

Gæt en Datatype ?

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.

Comments

5/1/2009 5:10:06 PM #

SQL Server følgende nogle fastsatte regler for at udregne precision og scale:
msdn.microsoft.com/en-us/library/ms190476.aspx

Da vi har med en divison at gøre ser udregningen således ud:
Precision = p1 - s1 + s2 + max(6, s1 + p2 + 1) = 5 - 2 + 2 + max(6, 2 + 5 + 1) = 5 + 8 = 13
Scale = max(6, 2 + 5 + 1) = 8

Dvs. vi kommer fra en dec(5,2), men grundet divisionen bliver den nye datatype gemt som dec(13,8)

Mark S. Rasmussen Denmark |

5/1/2009 5:47:38 PM #

Top nice Mark - tak for info Smile

Så faktisk selvom jeg har 2 ens datatyper i min select, kan jeg ende op med konvertering anyway - har jeg aldrig lige overvejet. Crazy.

Martin Denmark |

Comments are closed

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen