7
votes

La conversion a échoué lors de la conversion de la valeur Varcharne au type de données INT dans SQL

J'ai écrit la procédure de magasin qui doit renvoyer les valeurs comme- xxx

J'ai la table nommée journal_enterry . Lorsque le nombre de lignes de la table est 0, il donne le résultat J1 mais comme augmente le nombre de lignes, il affiche l'erreur - xxx

Le Voucher_no est la colonne du résultat à enregistrer.

Le code est comme - xxx


4 commentaires

Si possible, il serait préférable de stocker le préfixe et le nombre dans des colonnes séparées - il rend le code tel que le plus précisément plus facile à écrire. Si le préfixe est toujours j qui n'a pas besoin de ne pas être stocké du tout. Et vous pouvez toujours créer une colonne calculée qui les combine ensemble dans une seule colonne, si vous en avez vraiment besoin.


Je suis aussi en difficulté pour comprendre pourquoi vous CAST Le max résultat dos à un varchar , juste pour , sur la ligne suivante, couler retour à int .


En fait, j'ai besoin du résultat que J1, J2 de sorte qu'il puisse être montré dans l'application en tant que numéro de bon de bon et aussi stocké dans la colonne unique.


Vous ne devriez pas baser votre structure de base de données autour de votre Afficher ou Formatage . Logiquement, le nombre et le préfixe sont deux éléments de données distincts sur lesquels vous souhaitez effectuer le traitement - ils doivent être dans des colonnes séparées.


5 Réponses :


2
votes

Vos coutures de problèmes à être localisées ici:

SELECT @maxCode = CAST(MAX(CAST(SUBSTRING(Voucher_No,LEN(@startFrom)+1,LEN(Voucher_No)- LEN(@Prefix)) AS INT)) AS varchar(100)) FROM dbo.Journal_Entry;
SET @sCode=CAST(@maxCode AS INT)


0 commentaires

1
votes

Essayez celui-ci -

CREATE PROC [dbo].[getVoucherNo]
AS BEGIN

     DECLARE 
            @Prefix VARCHAR(10) = 'J'
          , @startFrom INT = 1
          , @maxCode VARCHAR(100)
          , @sCode INT

     IF EXISTS(
          SELECT 1 
          FROM dbo.Journal_Entry
     ) BEGIN

          SELECT @maxCode = CAST(MAX(CAST(SUBSTRING(Voucher_No,LEN(@startFrom)+1,ABS(LEN(Voucher_No)- LEN(@Prefix))) AS INT)) AS varchar(100)) 
          FROM dbo.Journal_Entry;

          SELECT @Prefix + 
               CAST(LEN(LEFT(@maxCode, 10) + 1) AS VARCHAR(10)) + -- !!! possible problem here
               CAST(@maxCode AS VARCHAR(100))

     END
     ELSE BEGIN

          SELECT (@Prefix + CAST(@startFrom AS VARCHAR)) 

     END

END


1 commentaires

Cast Valeur tronquée de @maxcode, donc Cast (@maxcode comme Varcharchar (10) est égal à gauche (@maxcode, 10) .



2
votes

La ligne xxx pré>

est incorrecte. p>

@prefix code> est 'J' code> et et Len (... n'importe quoi ...) code> est un int code>, d'où l'inadéquation de type. P>


Il me semble que vous voulez réellement faire , P>

SELECT
        @maxCode = MAX(
            CAST(SUBSTRING(
                Voucher_No,
                @startFrom + 1,
                LEN(Voucher_No) - (@startFrom + 1)) AS INT)
    FROM
        dbo.Journal_Entry;

SELECT  @Prefix + CAST(@maxCode AS VARCHAR(10));


0 commentaires

5
votes

Le problème situé sur la ligne suivante

CREATE PROC [dbo].[getVoucherNo]

AS

BEGIN

    DECLARE @Prefix VARCHAR(10)='J'

    DECLARE @startFrom INT=1

    DECLARE @maxCode VARCHAR(100)

    DECLARE @sCode INT

    IF((SELECT COUNT(*) FROM dbo.Journal_Entry) > 0)
    BEGIN
        SELECT @maxCode = CAST(MAX(CAST(SUBSTRING(VoucharNo,LEN(@startFrom)+1,LEN(VoucharNo)- LEN(@Prefix)) AS INT))+1 AS varchar(100)) FROM dbo.Journal_Entry;
        SET @sCode=CAST(@maxCode AS INT)
        SELECT  @Prefix + CAST(LEN(CAST(@maxCode AS VARCHAR(10))+1) AS VARCHAR(100)) + CAST(@maxCode AS VARCHAR(100))
    END
    ELSE
    BEGIN
        SELECT(@Prefix + CAST(@startFrom AS VARCHAR)) 
    END
END


2 commentaires

Après l'édition, cela fonctionnait, mais pourquoi il ajoute le numéro après le préfixe 'J'?


@Droid_RUSH, cette réponse identifie le même problème que ma réponse, une heure plus tard. Stackoverflow.com/a/17568151/659190 .



5
votes

J'ai le même message d'erreur. Dans mon cas, cela devait utiliser des citations.

Bien que la colonne n'ait censé avoir que des chiffres, il s'agissait d'une colonne Varcharne et une des lignes avait une lettre dedans. P>

Donc, je faisais cela: P>

select * from mytable where myid = '1234'


0 commentaires