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.
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.
Voici la formule de colonne calculée:
(CONVERT([int],[Pro_PCT])-CONVERT([int],replace([Max_Off],'%','')))
Définitions des champs:
Select * from MyTable
4 Réponses :
Basé sur la formule - soit Voici ce que vous pouvez faire pour trouver toutes les lignes qui causeront ce problème problème: 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 Pro_PCT
ou Max_Off
contient la valeur 11.11
(enfin, avec un % code > pour
au lieu de Max_Off
. Peut-être qu'ils contiennent également d'autres valeurs qui ne peuvent pas être converties en int
. Select *
from MyTable
where try_cast(Pro_PCT as int) is null
or try_cast(replace([Max_Off],'%','') as int) is null
try_cast
ou try_convert convert
.
Vérifiez les mauvaises données avec
select * from MyTable where isnumeric( Max_Off ) = 0
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.
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
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))?
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.
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 desPro_Pct
etMax_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.