Quel est le type de données de "select 123.866" dans SQL Server 2005?

Si je viens d'écrire quelque chose comme

select 10.00; 

Quel type me donne-t-il?

Voici un test que j'ai exécuté pour tester la représentation binary de ces types. La grande surprise ici est qu'aucun des moules ne correspond vraiment à la première rangée!

 select cast(123.866 as binary) union all select cast(cast(123.866 as real) as binary) union all select cast(cast(123.866 as float) as binary) union all select cast(cast(123.866 as decimal) as binary) union all select cast(cast(123.866 as numeric) as binary) union all select cast(cast(123.866 as money) as binary) union all select cast(cast(123.866 as smallmoney) as binary) -------------- 0x0000000000000000000000000000000000000000000006030001DAE30100 0x000000000000000000000000000000000000000000000000000042F7BB64 0x00000000000000000000000000000000000000000000405EF76C8B439581 0x00000000000000000000000000000000000000000000120000017C000000 0x00000000000000000000000000000000000000000000120000017C000000 0x00000000000000000000000000000000000000000000000000000012E684 0x00000000000000000000000000000000000000000000000000000012E684 

Quelqu'un peut-il expliquer cela?


À l'origine, tout ce que je voulais faire était d'éviter d'avoir à écrire l'instruction cast, en supposant que 123.866 était implicitement une décimale. J'ai donc pensé tester si ces deux affirmations étaient les mêmes:

 select cast(123.866 as decimal) select 123.866 

Il est implicitement typé comme decimal (6,3) – cast vers ceci et vous verrez les valeurs binarys correspondre. Il semble utiliser décimal au plus petit tpe pour s'adapter à la valeur – dans ce cas, 6 numbers dont 3 après la décimale.

En plus de la réponse de @David M , voici un moyen de find le type directement, trouvé ici: less than dot: Comment implémenter un opérateur typeof en SQL en utilisant sql_variant_property :

 select CAST(SQL_VARIANT_PROPERTY(123.866, 'BaseType') AS VARCHAR(20)) AS Type, CAST(SQL_VARIANT_PROPERTY(123.866, 'Precision') AS INT) AS Precision, CAST(SQL_VARIANT_PROPERTY(123.866, 'Scale') AS INT) AS Scale 

Ce qui me donne cette réponse:

 Type Precision Type numeric 6 3 

Notez que j'ai testé cela sur SQL Server 2008, pas 2005. J'espère que cette fonction est disponible en 2005.

numeric est décrit plus en détail ici: Types de données (Transact SQL) , et ici: décimal et numérique (Transact-SQL) .

Dans votre test, vous utilisez tous les syndicats. Saviez-vous que toutes les valeurs seront converties en un même type de données dans une requête union?

Problèmes de précision et d'échelle de SQL Server

Cet article montre également ce qui se passe lorsque vous combinez plusieurs types de données set.

Êtes-vous sûr de devoir le diffuser dans votre requête? Lorsque vous select le résultat, quelle est la prochaine étape pour le traiter? S'il s'agit d'une application, faites en sorte que le code détermine correctement et lance le type (si nécessaire). S'il s'agit d'une autre requête, vous pourrez peut-être la transmettre sans problème.