0
votes

Pourquoi dans SQL Server ne peut-il pas renvoyer une erreur appropriée dans la conversion de type de données décimale?

Quand j'écris la requête comme xxx

Il m'a donné une conversion d'erreur échoué lors de la conversion de la valeur de Varcharne en "44. 6 'To Type de données INT

Pourquoi il ne peut pas renvoyer une erreur appropriée pour Decimal ne peut pas convertir en int.


4 commentaires

Enfermer un numéro en guillemets simples '' en fait une chaîne, pas un nombre.


Type de données PRECÉDENCE SELECT 3 + '44. 5 ' => conversion vers INT, Sélectionnez 3.0 + '44. 5 ' => conversion en numérique. '44. 5 ' est un littéral INT / numérique invalide


Parce que ce n'est pas l'erreur appropriée. Sélectionner 3 + 44.5 fonctionnerait bien car int peut être favorisé à décimal . Sélectionnez 3.0 + '44. 5 ' donnerait une erreur sur varchar ne convertissant pas en numérique . En aucun cas, le débordement n'aura pas eu une erreur pour convertir décimal sur int , car cette conversion est autorisée (avec arrondissement implicite).


^ Et s'il s'agissait d'un littéral numérique valide, 44.5 , vous obtiendrez toujours "Erreur de débordement arithmétique convertissant Varcharneau en numérique numérique" car 3.0 aurait défini le type d'expression à numérique (2,1) et 44.5 est numérique (3,1) .


3 Réponses :


0
votes

Retirez la citation unique. La citation signifie qu'il s'agit d'une valeur de chaîne et non d'une valeur de nombres réel. xxx


0 commentaires

0
votes

Il y a deux sorties possibles que vous pourriez souhaiter: 47.5 en tant que numéro ou 344.5 en tant que chaîne: xxx

ou. .. xxx


0 commentaires

0
votes

Premièrement, cette page vous dira tout ce que vous devez savoir sur ce sujet (et peut être utilisé pour guérir insomnie): Conversion de type de données (moteur de base de données)

Suivant, ce que vous Publié est '44. 5 ' code> qui ne peut pas être converti en nombre. Cela échoue, quel que soit le type de données numériques que vous essayez: p> xxx pré>

Ceci échouera car SQL ne peut pas déterminer si vous enregistrez des numéros ou du texte concaténant: P> xxx pré>

Celles-ci fonctionneront pour les mathématiques: p> xxx pré>

Celles-ci fonctionneront pour la concision: p>

Select '3' + '44.5';
Select CAST(3 AS VARCHAR(10)) + '44.5'
Select CONCAT(3, '44.5');


2 commentaires

La déclaration indiquant que "SQL ne peut déterminer si vous enregistrez des chiffres ou un texte de concaténation" pour le second cas n'est pas correct. Les règles de promotion implicites signifient que SQL Server tentera de convertir 44.6 sur int (le type de 3 ), qui échoue comme le point décimal n'est pas autorisé. Il n'y a pas de confusion (au moteur, au moins) sur ce qui est tenté là-bas: Sélectionnez 3 + '44' est autorisé et est sans ambiguïté 47 , pas 344 (et notez que l'ordre des opérandes n'a pas d'importance pour la frappe: '3' + 44 est également 47 ).


@ Jeroenmostert - accepté. Merci pour la correction. J'ai fait un travail médiocre, ce que j'essayais de dire .. Mon point était que la syntaxe de l'OP ne dit pas correctement au moteur SQL ce qu'il est qu'ils essayaient de faire.