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
119k23 gold badges164 silver badges185 bronze badges
asked Jul 10, 2013 at 10:14
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
answered Jul 10, 2013 at 11:31
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-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 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
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
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 | ||
|
- 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
-
Marked as answer by
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с записываю данные в скл. Есть запрос, с условием:
Так вот, после выполнения, 1с выдаёт ошибку: |
||
shuhard
1 — 24.06.18 — 15:19 |
(0) в 100500 раз |
||
1ctube
2 — 24.06.18 — 15:22 |
(1) значит, когда из скл в 1с я получаю данные НаборЗаписей.Fields(«Year»).Value то 1с форматирует число в строку? Если в скл 2018, в 1с получается «2 018»? |
||
МихаилМ
3 — 24.06.18 — 15:23 |
+(1) |
||
Смотрящий
4 — 24.06.18 — 15:32 |
Это конечно жесть когда число отдается нечислом … |
||
youalex
5 — 24.06.18 — 15:36 |
(0) не понял. Ну и, конечно, если записать литерал без пробела, даже в кавычках, то умный скуль его неявно преобразует в 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 |
Еще большая жесть когда из внешнего источника данные прямо в запрос без проверки пихают. |