1
votes

La conversion a échoué lors de la conversion de la valeur nvarchar en type de données int - Message d'erreur

Ma requête

[Pro_PCT] [nvarchar](50) NULL,
[Max_Off] [nvarchar](50) NULL,
[IsExceeds]  AS (CONVERT([int],[Pro_PCT])-CONVERT([int],replace([Max_Off],'%','')))

Le tableau se compose de 300 000 lignes. Il fonctionne sur plus de 200 000 lignes et cette erreur apparaît.

entrez la description de l'image ici

Comment gérer cela pour obtenir les données complètes? p >

MyTable a-t-il des colonnes calculées?

Le tableau se compose d'une colonne calculée avec le nom IsExceeds qui est donné ci-dessous pour votre référence.

entrer l'image description here

Voici la formule de colonne calculée:

(CONVERT([int],[Pro_PCT])-CONVERT([int],replace([Max_Off],'%','')))

Définitions des champs:

Select * from MyTable


9 commentaires

MyTable a-t-il des colonnes calculées? Il est probablement préférable que vous partagiez la définition de la table


Veuillez ne pas ajouter de balises non pertinentes


Le type de données Int peut simplement stocker des nombres entiers, comme cela est évident. vous essayez de convertir 11.11 en int, ce qui est impossible. Vous devez définir le type de données à float, double, ...


À moins qu'il n'y ait une colonne calculée (non persistante) dans la définition de la table, je ne vois pas comment cette requête seule peut produire cette erreur.


La table Oui se compose d'une colonne calculée. J'ai édité mon message et inclus le nom du champ et la référence du type de données de cette colonne calculée pour votre référence.


Nous avons besoin de voir le calcul lui-même et les définitions de toutes les colonnes auxquelles il fait référence, pas seulement une image montrant qu'il est effectivement calculé. De préférence une instruction CREATE TABLE avec toutes les colonnes non pertinentes supprimées, de préférence sous forme de texte plutôt que sous forme d'image.


Mise à jour du message initial avec les informations requises.


Bien, vous stockez donc certaines de vos données dans des types de données inappropriés et avez 11.11 et éventuellement d'autres valeurs dans l'un des Pro_Pct et Max_Off . Donc, sélectionnez les 100 premiers * de MyTable où Pro_Pct comme '% [^ 0-9]%' ou Max_Off comme '% [^ 0-9]%' devrait vous donner un échantillon des lignes problématiques. Vous seul savez si cela impliquera de corriger les données ou d'ajuster la colonne calculée.


Vous pouvez le convertir en numérique si cela a du sens. Ou convertir en numérique, puis int.


4 Réponses :


1
votes

Basé sur la formule - soit Pro_PCT ou Max_Off contient la valeur 11.11 (enfin, avec un % code > pour Max_Off . Peut-être qu'ils contiennent également d'autres valeurs qui ne peuvent pas être converties en int .

Voici ce que vous pouvez faire pour trouver toutes les lignes qui causeront ce problème problème:

Select * 
from MyTable
where try_cast(Pro_PCT as int) is null
or try_cast(replace([Max_Off],'%','') as int) is null

Une fois que vous les avez trouvés, vous pouvez soit corriger les valeurs, soit modifier le calcul de la colonne calculée pour utiliser try_cast ou try_convert

au lieu de convert.


0 commentaires

1
votes

Vérifiez les mauvaises données avec

select  * from MyTable where isnumeric(  Max_Off ) = 0 


3 commentaires

Ce serait tout à fait correct de vous dire que 11.11 est numérique. Parce que isnumeric répond à une question qu'aucune personne sensée n'a jamais voulu poser.


Je suis d'accord, mais cela aide quand même à essayer d'obtenir un aperçu rapide des mauvaises données. Encore mieux Sélectionnez distinct (Max_Off) de MyTable où isnumeric (Max_Off) = 0. Mais je suppose que cela dépend vraiment de la façon dont les données sont vraiment bizarres


oui, mais isnumeric ne garantit pas que la valeur peut être convertie en int. En fait, cela ne garantit même pas qu'il puisse être directement converti en n'importe quel type de données numériques de serveur sql.



2
votes

Veuillez convertir en float puis convertir en int.

declare @n nvarchar(20)
set @n='11.11'

if (isnumeric(@n)=0)
 SELECT 0
   else 
      SELECT CAST(CONVERT(float, @n) as int) AS n


3 commentaires

Ce n'est pas un gros problème, mais il vaut mieux ne pas mélanger CAST et CONVERT. Tenez-vous en à l'un d'entre eux et utilisez-le. Faites soit 2 CASTs soit 2 CONVERTs. Y a-t-il une raison particulière pour laquelle vous avez utilisé les deux ensemble?


CONVERT (float, @n) renvoie 11.11 et CAST (CONVERT (float, @n) as int) retourne 11


pourquoi pas CAST (CAST (@n AS FLOAT) AS INT) ou CONVERT (int, CONVERT (float, @n))?



2
votes

Pourquoi stockez-vous les montants sous forme de chaînes? C'est le problème fondamental.

Je vous suggère donc de corriger vos données. Quelque chose comme ceci:

(Pro_PCT - Max_Off)

(Sans exemple de données ou un exemple des données que je devine juste sur un type raisonnable.)

Ensuite, vous pouvez définissez IsExceeds comme:

update mytable
    set max_off = replace(max_off, '%');

alter table mytable alter pro_pct numeric(10, 4);
alter table mytable alter max_off numeric(10, 4);

Voila! Pas de problème.


0 commentaires