SQL Server 2008: Erreur de conversion de type de données nvarchar à flotteur
Actuellement dépannage d'un problème où l'exécution de la requête SQL:
UPDATE tblBenchmarkData
SET OriginalValue = DataValue, OriginalUnitID = DataUnitID,
DataValue = CAST(DataValue AS float) * 1.335
WHERE
FieldDataSetID = '6956beeb-a1e7-47f2-96db-0044746ad6d5'
AND ZEGCodeID IN
(SELECT ZEGCodeID FROM tblZEGCode
WHERE(ZEGCode = 'C004') OR
(LEFT(ZEGParentCode, 4) = 'C004'))
Résultats dans l'erreur suivante:
Msg 8114, Niveau 16, État 5, Ligne 1
Erreur lors de la conversion de type de données nvarchar à flotteur.
Vraiment la chose étrange est, si je change le UPDATE
à SELECT
pour inspecter les valeurs récupérées sont des valeurs numériques:
SELECT DataValue
FROM tblBenchmarkData
WHERE FieldDataSetID = '6956beeb-a1e7-47f2-96db-0044746ad6d5'
AND ZEGCodeID IN
(SELECT ZEGCodeID
FROM tblZEGCode WHERE(ZEGCode = 'C004') OR
(LEFT(ZEGParentCode, 4) = 'C004'))
Voici les résultats:
DataValue
2285260
1205310
Souhaitez utiliser TRY_PARSE
ou quelque chose comme cela; cependant, nous sommes en cours d'exécution sur SQL Server 2008, plutôt que de SQL Server 2012. Quelqu'un aurait-il des suggestions? TIA.
OriginalL'auteur user8128167 | 2012-02-03
Vous devez vous connecter pour publier un commentaire.
Il serait utile de voir la définition de schéma de tblBenchmarkData, mais vous pouvez essayer d'utiliser ISNUMERIC dans votre requête. Quelque chose comme:
les œuvres et les œuvres.
OriginalL'auteur csm8118
Ordre d'exécution ne correspond toujours à vos attentes.
Si vous définissez un
where
clause, il généralement ne signifie pas que les calculs dans leselect
liste ne sera appliquée que dans les lignes qui correspondent à cewhere
. SQL Server peut facilement décider de faire un bloc de calcul, puis de filtrer tous les lignes.Cela dit, vous pouvez facilement écrire try_parse vous-même:
OriginalL'auteur GSerg
Afin de commencer avec votre requête de mise à jour qui donne un message d'erreur (s'il vous plaît pardonnez-moi pour la réécrire pour mon propre plus de clarté):
Je pense que vous trouverez qu'une instruction SELECT avec exactement les mêmes expressions donnera la même erreur:
Cela devrait vous montrer les lignes qui ne peuvent pas convertir:
Le truc dans la dernière ligne de commentaire est de virer de bord sur les choses de la chaîne à la force que de numéros valides pour être numérique. Par exemple, si vous voulais que des nombres entiers,
IsNumeric(DataValue + '.0E0') = 0
serait de vous montrer ceux qui ne le sont pas.Aha, si vous avez réellement notation scientifique déjà à l'époque, mon truc à virer de bord sur " E0 " ne fonctionne pas. Mais la fonction IsNumeric devriez toujours être en mesure de vous aider.
OriginalL'auteur ErikE