Σήμερα είχα μια ερώτηση από ένα συνάδελφο σχετικά με το συγκεκριμένο data type αφού πρώτα είχαμε κάνει μια εσωτερική εκπαίδευση πριν από αρκετές μέρες και σε αυτή είχαμε μιλήσει για τα data types που έχει ο SQL Server.
Στην εκπαίδευση αυτή είχα αναφέρει όπως πάντα στις εκπαιδεύσεις που κάνω ότι τα money & smallmoney είναι data types τα οποία πρόκειται να αποσυρθούν και ο αντικαταστάτης τους είναι το decimal data type. O συνάδελφος μου ζήτησε να του δείξω που στο documentation του προϊόντος αναφέρεται ρητά αυτό.
Αυτό με έβαλε στο να ψάξω και πραγματικά πλέον δεν βρήκα κάποια τέτοια αναφορά ενώ βρήκα για τα image, text, ntext που και αυτά πρόκειται να αποσυρθούν. Αυτό με έβαλε σε υποψίες και ρώτησα τους αρμόδιους για αυτά και έμαθα ότι πλέον δεν είναι σε αυτό το status και συνεχίζουν κανονικά σαν data types.
Με δεδομένο αυτό έκρινα σκόπιμο να γράψω το συγκεκριμένο άρθρο ώστε να δούμε λίγο σε βάθος το συγκεκριμένο data type ώστε να είμαστε όλοι σίγουροι για το πως αυτό συμπεριφέρεται όταν θα το χρησιμοποιήσουμε.
Από τα docs του SQL Server αν θα δούμε το money & smallmoney αυτά έχουν τα παρακάτω χαρακτηριστικά:
Money (8 bytes) value range -922,337,203,685,477.5808 to 922,337,203,685,477.5807
Smallmoney (4 bytes) value range - 214,748.3648 to 214,748.3647
Αυτό που πρέπει να παρατηρήσουμε είναι ότι και τα 2 έχουν 4 δεκαδικά ψηφία.
Από άποψη χώρου είναι όπως ακριβώς το int & smallint data types τι σημαίνει αυτό ας το δούμε με παραδείγματα.
declare @d decimal(38,10)
set @d=700
select @d/13 as col1
, @d/130 as col2
, @d/1300 as col3
, @d/13000 as col4
, @d/130000 as col5
, @d/1300000 as col6
, @d/13000000 as col7
go
declare @d decimal(38,4)
set @d=700
select @d/13 as col1
, @d/130 as col2
, @d/1300 as col3
, @d/13000 as col4
, @d/130000 as col5
, @d/1300000 as col6
, @d/13000000 as col7
go
declare @d decimal(38,4)
set @d=700
select cast (@d/13 as decimal(38,4)) as col1
, cast (@d/130 as decimal(38,4)) as col2
, cast (@d/1300 as decimal(38,4)) as col3
, cast (@d/13000 as decimal(38,4)) as col4
, cast (@d/130000 as decimal(38,4)) as col5
, cast (@d/1300000 as decimal(38,4)) as col6
, cast (@d/13000000 as decimal(38,4)) as col7
go
declare @m money
set @m=700
select @m/13 as col1
, @m/130 as col2
, @m/1300 as col3
, @m/13000 as col4
, @m/130000 as col5
, @m/1300000 as col6
, @m/13000000 as col7
go
Εκτελώντας τα παραπάνω τα αποτελέσματα είναι τα παρακάτω (με την σειρά εκτέλεσης)
/*
col1 col2 col3 col4 col5 col6 col7
--------------- --------------- --------------- --------------- --------------- --------------- ----------------
53.8461538461 5.3846153846 0.5384615384 0.0538461538 0.0053846153 0.0005384615 0.0000538461
53.846153 5.384615 0.538461 0.053846 0.005384 0.000538 0.000053
53.8462 5.3846 0.5385 0.0538 0.0054 0.0005 0.0001
53.8461 5.3846 0.5384 0.0538 0.0053 0.0005 0.00
*/
Εκτελώντας τα παραπάνω τα αποτελέσματα είναι τα παρακάτω (με την σειρά εκτέλεσης)
Αυτό που πρέπει να παρατηρήσουμε το money data type δεν κάνει στρογγυλοποίηση απλά παίρνει τα 4 πρώτα δεκαδικά ψηφία
Ακόμα κάτι που πρέπει να έχουμε υπόψη μας είναι οι δύο παρακάτω περιπτώσεις:
Στην πρώτη αν κάποιος βάλει σε money data type string όπως στο παράδειγμα
declare @m money
set @m=',1,,2,3,,,4,5,6,7,,,.8,9,,'
select @m
Θα πάρει κανονικά αριθμό που θα είναι ο 1234567.89
Αν το ίδιο κάνει με decimal θα πάρει conversion error
Τέλος η δεύτερη περίπτωση είναι στην περίπτωση που κάποιος κάνει σε ένα query το παρακάτω
select
case
when $100=€100 then 'equal'
else 'not equal'
end
Αυτό που θα πάρει είναι ότι είναι ίδια αλλά δεν είναι ίδια διότι έχουν διαφορετική ισοτιμία.
Μπορεί λοιπον να μην είναι προς εξαφάνιση τα data types αυτά αλλά καλό είναι να ξέρουμε πότε και πως αυτά πρέπει να χρησιμοποιηθούν.
//antonch