Longueur non valide paramètre passé à la GAUCHE ou la fonction SUBSTRING
J'ai la description suivante: "l'Échantillon de Produit Fabricant Nom du Produit XYZ - Taille' et je voudrais seulement obtenir la valeur de "Nom du Produit XYZ' à partir de ce. Si c'était seulement une ligne que j'avais n'ai pas de problème juste à l'aide de sous-CHAÎNE, mais j'ai des milliers de dossiers et, bien que la valeur initiale de l'Échantillon de Produit Maker est le même pour tous les produits, le Nom du Produit pourrait être différente et je ne veux pas que quoi que ce soit après le trait d'union.
Ce que j'ai jusqu'à présent a généré l'erreur dans l'en-tête de cette question.
SELECT i.Itemid,
RTRIM(LTRIM(SUBSTRING(i.ShortDescription, 25, (SUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25)))))) AS ProductDescriptionAbbrev,
CHARINDEX('-', i.ShortDescription, 0) - 25 as charindexpos
FROM t_items i
Je suis l'Argument de type de données varchar est pas valide pour l'argument 3 de la fonction de sous-chaîne'
Comme vous pouvez le voir, j'obtiens la valeur de la dernière ligne de l'instruction sql, mais quand j'essaie de le brancher que dans la fonction SUBSTRING-je obtenir diverses questions.
OriginalL'auteur brianhevans | 2012-10-23
Vous devez vous connecter pour publier un commentaire.
Les Chances sont bonnes que vous avez des lignes où le " - " est manquante, ce qui est la cause de votre erreur.
Essayez ceci...
Argument data type varchar is invalid for argument 3 of substring function
) est basé sur la syntaxe de l'OP de l'instruction SQL, pas les données récupérées.Ne cherchez pas la délinquance ligne juste dans les données extraites. Il peut être dans le dataset sous-jacent avant de la clause where. Qui rend difficile de trouver de la délinquance de la ligne, mais cette méthode résout dans les deux cas.
OriginalL'auteur Data Masseur
Vous pouvez également dépouiller le
Sample Product Maker
texte et à partir de là:Non, il n'est pas. Cela vous donne le résultat correct. Votre problème original a l'aide d'une chaîne au lieu d'un int pour le 3ème paramètre de la première sous-CHAÎNE. Et, à partir de la position 25 au lieu de 22.
La réponse à cette question est basée dans le fait que certains de mes chaînes n'ont pas un "-" si je revenais d'une valeur négative à la chaîne et qui ne fonctionne pas. C'est dommage, il y avait un meilleur descripteur d'erreurs. merci
OriginalL'auteur LittleBobbyTables
Votre premier appel à
SUBSTRING
spécifie une longueur deSUBSTRING(i.ShortDescription, 25, CHARINDEX('-', i.ShortDescription, 25))
.Vous pourriez essayer:
OriginalL'auteur HABO
Le problème, c'est que votre extérieur appel à
SUBSTRING
est passée un type de données caractère de l'intérieurSUBSTRING
appel dans le troisième paramètre.Le troisième paramètre doit correspondre à la longueur que vous souhaitez. Peut-être que vous avez voulu dire
LEN(SUBSTRING(...))
?OriginalL'auteur Peter Gluck
Semble que vous voulez quelque chose comme ceci (22, et non pas 25):
OriginalL'auteur GilM
Vous voulez:
Noter qu'une bonne pratique consiste à placer
charindex(...)
's etpatindex(...)
's avecnullif(...,0)
, puis de gérer la valeur null si vous le souhaitez (parfois nulle est le bon résultat, dans ce cas, nous voulons tous le texte de sorte que nousisnull(...,8000)
pour la durée que nous voulons).OriginalL'auteur bwperrin