2010-05-07 14 views
0

Msg 8114, niveau 16, état 5, Procédure spGetDetails, ligne 88
Erreur de conversion type de données varchar numérique.Conversion type de données varchar numérique

J'ai déjà converti ce @mfr_id en type int puis en obtenant également l'erreur ci-dessus.

Je reçois une erreur lors de l'exécution de la procédure stockée.

La ligne que je reçois l'erreur est:

if(@mfr_id = 5) 
+0

Quelle est la variable '@ mfr_id' déclarée? –

+0

@OMG Poneys "@mfr_id est varchar mais son stockage 1 2, 3, 4." De commentaires à ma réponse. –

Répondre

2

Utilisation:

if(@mfr_id = '5') 

comparaisons de valeur doivent être le même type de données, ou il doit être conversion implicite de type de données. La conversion explicite - qui est lorsque vous utilisez CAST/CONVERT - est idéale pour la maintenance car l'opération est évidente.

En fonction de vos besoins, la fonction ISNUMERIC peut vous aider. Et prenez soin de définir une longueur à vos variables [var] varchar.

1

réponse Mise à jour

Il semble donc que @mfr_id est un varchar. Pour éviter le problème syntaxique, utilisez la réponse dans OMG Poneys post.

Mais vous dites aussi qu'il stocke la chaîne "1 2, 3, 4 .....". Sémantiquement, voulez-vous que l'instruction IF soit vraie si elle contient la valeur '5'?

Si oui, vous pourriez avoir besoin quelque chose comme ça

set @mfr_id = REPLACE(@mfr_id, ' ','') 
if ((@mfr_id LIKE '5,%') OR (@mfr_id LIKE '%,5,%') OR (@mfr_id LIKE '%,5')) 

Réponse originale - Obsolète

if(CONVERT(int, @mfr_id) = 5) 

devrait faire l'affaire, espérons. Voir http://msdn.microsoft.com/en-us/library/ms187928.aspx pour plus de détails. Bien qu'en fait je pense qu'il devrait être implicitement converti. Quelle est la valeur de @mfr_id? Cela devrait vous le dire dans le message d'erreur je pense.

+0

@mfr_id est varchar mais son stockage 1 2, 3, 4 ...... – Anilkumar

+1

Ah dans ce cas faire de l'autre côté de l'expression une chaîne avec if (@mfr_id = '5'). Puis-je vérifier que vous avez besoin d'égalité et que vous n'essayez pas de faire un contrôle de type "contient"? –

+0

si la valeur de @mfr_id n'est pas numérique cela échouera, essayez: 'déclarez @mfr_id varchar (5); définissez @ mfr_id = 'A'; if (CONVERT (int, @mfr_id) = 5) PRINT 'obtiendra un erreur! '' –

0

Cette réponse est écrite en utilisant la syntaxe PL/SQL d'Oracle et l'une des routines d'expression rationnelle Oracle. Je ne connais pas assez bien T-SQL pour retranscrire, mais je pense que des capacités similaires sont disponibles:

FOR aRow IN 
    (WITH DATA AS (SELECT @mfg_id AS S FROM DUAL) 
    SELECT REGEXP_SUBSTR(S, '[^ ,]+', 1, LEVEL) AS NUM_STRING 
     FROM DATA 
     CONNECT BY LEVEL < LENGTH(S) - LENGTH(REGEXP_REPLACE(S, '[ ,]', ''))) 
LOOP 
    IF aRow.NUM_STRING = '5' THEN 
    NULL; -- do something appropriate here 
    END IF; 
END LOOP; 

Share and Enjoy.

Questions connexes