Ошибка при преобразовании типа данных varchar к int

I wrote the store procedure which should return the values like-

J1
J2
J3

I have table named Journal_Entry. When the row count of the table is 0, it gives the result J1 but as the row count increases it shows the error-

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

#here the Voucher_No is the column for the result to be saved.

The code is like-

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

Devart's user avatar

Devart

119k23 gold badges164 silver badges185 bronze badges

asked Jul 10, 2013 at 10:14

naren's user avatar

4

The problem located on the following line

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

Use this instead

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

Full Code:

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

Mohammad Areeb Siddiqui's user avatar

answered Jul 10, 2013 at 11:31

Jaychand's user avatar

2

I got the same error message. In my case, it was due to not using quotes.

Although the column was supposed to have only numbers, it was a Varchar column, and one of the rows had a letter in it.

So I was doing this:

select * from mytable where myid = 1234

While I should be doing this:

select * from mytable where myid = '1234'

If the column had all numbers, the conversion would have worked, but not in this case.

answered Feb 11, 2014 at 14:03

live-love's user avatar

live-lovelive-love

48k22 gold badges234 silver badges201 bronze badges

Your problem seams to be located here:

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)

As the error says, you’re casting a string that contains a letter ‘J’ to an INT which for obvious reasons is not possible.

Either fix SUBSTRING or don’t store the letter ‘J’ in the database and only prepend it when reading.

answered Jul 10, 2013 at 10:18

Jakub Konecki's user avatar

Jakub KoneckiJakub Konecki

45.5k7 gold badges87 silver badges126 bronze badges

The line

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

is wrong.

@Prefix is 'J' and LEN(...anything...) is an int, hence the type mismatch.


It seems to me, you actually want to do,

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

but, I couldn’t say. If you illustrated before and after data, it would help.

answered Jul 10, 2013 at 10:20

Jodrell's user avatar

JodrellJodrell

34.8k5 gold badges87 silver badges124 bronze badges

Try this one —

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

answered Jul 10, 2013 at 10:20

Devart's user avatar

DevartDevart

119k23 gold badges164 silver badges185 bronze badges

1

Студворк — интернет-сервис помощи студентам

Есть 3 таблицы:

Покупатели — customer(id,name,city,phone,rating)
поставщики — supplier(id,name,city,phone)
договор — contract(id,cust_id,sup_id,date,sum)

Пытаюсь сделать приложение для работы с БД. На одной из форм для таблицы contract использую компонент DBLookupcomboboxEh. В нем появляется список покупателей, выбираю одну из фамилий, а в бд нужно занести его id. Аналогично с поставщиками. Проблема состоит в том, что при добавление новой записи(заключении нового договора) появляется такая ошибка: Ошибка при преобразовании типа данных varchar к int. Как я понимаю в DBLookupcomboboxEh отображается фамилия (тип nvarchar), а id (int). Подскажите пожалуйста как исправить эту ошибку.

Параметры DBLookupcomboboxEh вроде настроены правильно:

Для покупателей:
DataField-cust_id
DataSource-DataModule2.ContractDataSource
KeyField-id
ListField-name
ListSource-DataModule2.CustomerDataSource

C поставщиками аналогично.

Код (для добавления записи):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm5.btn1Click(Sender: TObject);
var cust_id, sup_id, date, sum: string;
 
begin
   cust_id:=QuotedStr(unit5.form5.dblkpcmbxhcust_id.text);
   sup_id:=QuotedStr(unit5.form5.dblkpcmbxhsup_id.text);
   dbdth2.Text:= DateToStr(dtp1.Date);
   date:=QuotedStr(unit5.form5.dbdth2.text);
   sum:=QuotedStr(unit5.form5.dbdth1.text);
 
   with Unit2.DataModule2.qry  do
   begin
     Close;
     SQL.Clear;
     SQL.Add('exec add_contract' +cust_id+','+sup_id+','+date+','+sum);
     Execsql;
     Unit2.DataModule2.ContractQuery.Active:=False;
     Unit2.DataModule2.ContractQuery.Active:=true;
   end;
end;
  • Remove From My Forums
  • Question

  • Sorry to ask such a dumb question, but why can I not convert a varchar to int?

    Select [Index Name],  count([adj count]) as 'total', cast([adj count] as int) as 'adj count'--, count([adj count]) as 'total'
    FROM [Test_DB].[dbo].[SPBMI_Count]
    Where [Index Name] in ('S&P Global Ex-U.S. LargeMidCap (US Dollar)','S&P Emerging SmallCap (US Dollar)',
    'S&P Global BMI (US Dollar)', 'S&P Emerging LargeMidCap (US Dollar)',  
    'S&P Global Ex-U.S. SmallCap (US Dollar)')
    group by [Index Name],[adj count]

    The problem is here.

    cast([adj count] as int) as ‘adj count’

    The datatype is varchar(10)

    I tried both cast & Convert; neither works.


    Knowledge is the only thing that I can give you, and still retain, and we are both better off for it.

Answers

  • In follow code, you want to convert string to int:

    cast([adj count] as int)

    Please check if this column has string data or not? You can use follow code:

    Select *
    FROM [Test_DB].[dbo].[SPBMI_Count]
    where [adj count] like '%[a-z]%'
    

    This sample shows the same error:

    declare @test varchar(10) 
    set @test = '1000000000'
    select CAST( @test as int )
    
    set @test = 'test101'
    select CAST( @test as int )


    Saeid Hasani [sqldevelop]

    • Marked as answer by

      Tuesday, June 24, 2014 10:52 PM

Which values do you expect in ld.id, vf.CustID and vf.Simo? SQL Server has no concept of the meaning of NA or None. It will just compare two values…

If None means NULL (no value exists) you might use

WHERE vf.CustID IS NOT NULL

If you have a value indicating your None (e.g. negative numbers) you might use something like

WHERE vf.CustID>=0

In any case you have to be aware of datatypes, whenever you want to compare values (sorting, joining, filters, constraints…)

UPDATE

According to this

ld.fid is string and vf.fid is in int

the problem (or better: One of your problems) is here:

WHERE (ld.fid = vf.fid)

Again: What values do you expect? A JOIN (old-fashioned or real) connects rows with identical values. Since your vf.fid is INT there will be plain numbers, nothing else.

Whatever value is in ld.fid it will only be identical, if it is a plain number.

You did not mention your version of SQL Server. Starting with 2012 there are very handsome TRY_ functions. You’ve got some answers already…

With an earlier version you might try it with:

WHERE (ISNUMERIC(ld.fid) AND CAST(ld.fid AS INT) = vf.fid)

Another approach was a cast to VARCHAR like

WHERE (ld.fid=CAST(vf.fid AS VARCHAR(100)))

but you must be aware, that simple format differences like 100.0 or 100 (see the blanks!) would break this approach. If possible, try to keep it typesafe…

And don’t forget: The error message you posted points to None and not to the joining fields. So I’m quite sure, that you have more than one type conversion issue…

Я
   1ctube

24.06.18 — 15:18

День добрый. Из 1с записываю данные в скл. Есть запрос, с условием:

AND Year = ‘» + НаборЗаписей.Fields(«Year»).Value + «‘»;

Так вот, после выполнения, 1с выдаёт ошибку:

Ошибка преобразования значения varchar «2 018» в тип данных int.

Тип поля «Year «в скл как раз int, и значения в поле скльной базы:»2018».

Это значит вот здесь: НаборЗаписей.Fields(«Year»).Value данные представлены в типе данных varchar ? Как преобразовать в int на стороне 1с?

   shuhard

1 — 24.06.18 — 15:19

(0) в 100500 раз

2 018 не число, число 2018

   1ctube

2 — 24.06.18 — 15:22

(1) значит, когда из скл в 1с я получаю данные НаборЗаписей.Fields(«Year»).Value то 1с форматирует число в строку? Если в скл 2018, в 1с получается «2 018»?

   МихаилМ

3 — 24.06.18 — 15:23

+(1)

https://yandex.ru/search/?text=1с%20убрать%20пробелы%20в%20числе&lr=213

   Смотрящий

4 — 24.06.18 — 15:32

Это конечно жесть когда число отдается нечислом …

   youalex

5 — 24.06.18 — 15:36

(0) не понял.

Если «Тип поля «Year «в скл как раз int», то зачем ты литерал в условии включаешь в одинарные кавычки?

вот это: = ‘» +  + «‘»  ?

Ну и, конечно, если записать литерал без пробела, даже в кавычках,  то умный скуль его неявно преобразует в int

   spectre1978

6 — 24.06.18 — 15:37

(0) а зачем одинарные кавычки? И почему не воспользоваться ADO параметрами вместо того чтобы формировать запрос из кусков?

   hhhh

7 — 24.06.18 — 16:10

(0) AND Year = ‘» + Формат(НаборЗаписей.Fields(«Year»).Value, «ЧГ=0») + «‘»;

с тебя 500р в кассу мисты.

   Asmody

8 — 24.06.18 — 17:44

(4) Жесть когда число при неявном преобразовании в строку получает расделители разрядов.

  

Asmody

9 — 24.06.18 — 17:47

Еще большая жесть когда из внешнего источника данные прямо в запрос без проверки пихают.

  • Ошибка при преобразовании типа данных varchar к float sql
  • Ошибка при преобразовании типа данных varchar к bigint sql
  • Ошибка при преобразовании типа данных nvarchar к float sql
  • Ошибка при преобразовании типа данных nvarchar к datetime
  • Ошибка при преобразовании типа данных nvarchar к bigint