web-dev-qa-db-fra.com

La conversion a échoué lors de la conversion de la valeur varchar en type de données int dans sql

J'ai écrit la procédure de stockage qui devrait retourner les valeurs comme-

J1
J2
J3

J'ai une table nommée Journal_Entry. Lorsque le nombre de lignes du tableau est 0, il donne le résultat J1 mais à mesure que le nombre de lignes augmente, il montre l'erreur-

"Conversion failed when converting the varchar value 'J' to data type int."

#ici le Voucher_No est la colonne du résultat à enregistrer.

Le code est comme-

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(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)
        SELECT  @Prefix + LEN(CAST(@maxCode AS VARCHAR(10))+1) + CAST(@maxCode AS VARCHAR(100))
    END
    ELSE
    BEGIN
        SELECT(@Prefix + CAST(@startFrom AS VARCHAR)) 
    END

END
7
naren

Le problème situé sur la ligne suivante

SELECT  @Prefix + LEN(CAST(@maxCode AS VARCHAR(10))+1) + CAST(@maxCode AS VARCHAR(100))

Utilisez-le à la place

SELECT  @Prefix + CAST(LEN(CAST(@maxCode AS VARCHAR(10))+1) AS VARCHAR(100)) + CAST(@maxCode AS VARCHAR(100))

Code complet:

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
5
Jaychand

J'ai reçu le même message d'erreur. Dans mon cas, c'était dû à l'absence de guillemets.

Bien que la colonne ne devait contenir que des chiffres, il s'agissait d'une colonne Varchar et l'une des lignes contenait une lettre.

Donc je faisais ça:

select * from mytable where myid = 1234

Alors que je devrais faire ça:

select * from mytable where myid = '1234'

Si la colonne avait tous les nombres, la conversion aurait fonctionné, mais pas dans ce cas.

5
live-love

Votre problème semble se trouver 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)

Comme le dit l'erreur, vous transformez une chaîne contenant une lettre "J" en un INT qui, pour des raisons évidentes, n'est pas possible.

Soit corrigez SUBSTRING ou ne stockez pas la lettre 'J' dans la base de données et ne la ajoutez que lors de la lecture.

2
Jakub Konecki

La ligne

SELECT  @Prefix + LEN(CAST(@maxCode AS VARCHAR(10))+1) + CAST(@maxCode AS VARCHAR(100))

est faux.

@Prefix Est 'J' Et LEN(...anything...) est un int, d'où le décalage de type.


Il me semble que vous voulez vraiment faire,

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));

mais je ne pourrais pas dire. Si vous avez illustré les données avant et après, cela aiderait.

2
Jodrell

Essaye celui-là -

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
Devart