Quand j'écris la requête comme 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 P> Pourquoi il ne peut pas renvoyer une erreur appropriée pour Decimal ne peut pas convertir en int. P> P>
3 Réponses :
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.
Il y a deux sorties possibles que vous pourriez souhaiter: ou. .. p> 47.5 code> en tant que numéro ou
344.5 code> en tant que chaîne:
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 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> Celles-ci fonctionneront pour la concision: p> '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>
Select '3' + '44.5';
Select CAST(3 AS VARCHAR(10)) + '44.5'
Select CONCAT(3, '44.5');
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 code> sur
int code> (le type de
3 code>), 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' code> est autorisé et est sans ambiguïté
47 code>, pas
344 code> (et notez que l'ordre des opérandes n'a pas d'importance pour la frappe:
'3' + 44 code> est également
47 code>).
@ 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.
Enfermer un numéro en guillemets simples
'' code> en fait une chaîne, pas un nombre.
Type de données PRECÉDENCE
SELECT 3 + '44. 5 ' code> => conversion vers INT,
Sélectionnez 3.0 + '44. 5 ' code> => conversion en numérique. '44. 5 ' b> est un littéral INT / numérique invalide
Parce que ce n'est pas l'erreur appropriée.
Sélectionner 3 + 44.5 CODE> fonctionnerait bien car
int code> peut être favorisé à
décimal code>.
Sélectionnez 3.0 + '44. 5 ' code> donnerait une erreur sur
varchar code> ne convertissant pas en
numérique code>. En aucun cas, le débordement n'aura pas eu une erreur pour convertir
décimal code> sur
int code>, car cette conversion est autorisée (avec arrondissement implicite).
^ a > Et s'il s'agissait d'un littéral numérique valide,
44.5 code>, vous obtiendrez toujours "Erreur de débordement arithmétique convertissant Varcharneau en numérique numérique" car
3.0 code> aurait défini le type d'expression à
numérique (2,1) code> et 44.5 est
numérique (3,1) code>.