I am struggling for a few days with this issue and I can’t figure out how can I fix it.
I would like to group by
my table on values 1
,2
,3
,4
,5
so I have created a temporary table with this values.
Now I have to INNER JOIN
this table with other tables on a.value = #myTempTable.num
.
BUT a.value
is ntext
so I need to CONVERT
it what I actually did, but I am getting an error:
Conversion failed when converting the varchar value ‘simple, ‘ to data
type int. (on line 7)
Create table #myTempTable
(
num int
)
insert into #myTempTable (num) values (1),(2),(3),(4),(5)
SELECT a.name, CONVERT(INT, CONVERT(VARCHAR(12), a.value)) AS value, COUNT(*) AS pocet
FROM
(SELECT item.name, value.value
FROM mdl_feedback AS feedback
INNER JOIN mdl_feedback_item AS item
ON feedback.id = item.feedback
INNER JOIN mdl_feedback_value AS value
ON item.id = value.item
WHERE item.typ = 'multichoicerated' AND item.feedback IN (43)
) AS a
INNER JOIN #myTempTable
on CONVERT(INT, CONVERT(VARCHAR(12), a.value)) = #myTempTable.num
GROUP BY a.name, CONVERT(INT, CONVERT(VARCHAR(12), a.value)) ORDER BY a.name
drop table #myTempTable
I am not getting this error without the last INNER JOIN
INNER JOIN #myTempTable on CONVERT(INT, CONVERT(VARCHAR(12), a.value))
= #myTempTable.num
Could someone help me please?
Thanks.
- 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
Я застрял при преобразовании varchar
столбца UserID
в INT
. Я знаю, пожалуйста, не спрашивайте, почему этот UserID
столбец не был создан как INT первоначально, длинная история.
Я попробовал это, но это не сработало. и дай мне ошибку:
select CAST(userID AS int) from audit
Ошибка:
Ошибка преобразования при преобразовании значения varchar ‘1581……………………………………………………………………………………………………………. ‘к типу данных int.
Я select len(userID) from audit
и он возвращает 128 символов, которые не являются пробелами.
Я попытался определить символы ASCII для тех, кто тянется после идентификатора и значения ASCII = 0.
Я также попытался LTRIM
, RTRIM
и заменить char(0)
на ''
, но не работает.
Единственный способ это работает, когда я говорю фиксированное количество символов, как это ниже, но UserID
не всегда 4 символа.
select CAST(LEFT(userID, 4) AS int) from audit
Ответ 1
Вы можете попробовать обновить таблицу, чтобы избавиться от этих символов:
UPDATE dbo.[audit]
SET UserID = REPLACE(UserID, CHAR(0), '')
WHERE CHARINDEX(CHAR(0), UserID) > 0;
Но тогда вам также нужно будет исправить все, что помещает эти плохие данные в таблицу в первую очередь. Тем временем попробуйте:
SELECT CONVERT(INT, REPLACE(UserID, CHAR(0), ''))
FROM dbo.[audit];
Но это не долгосрочное решение. Исправьте данные (и тип данных, пока вы на нем). Если вы не можете исправить тип данных немедленно, вы можете быстро найти виновника, добавив ограничение проверки:
ALTER TABLE dbo.[audit]
ADD CONSTRAINT do_not_allow_stupid_data
CHECK (CHARINDEX(CHAR(0), UserID) = 0);
ИЗМЕНИТЬ
Итак, это определенно 4-значное целое число, за которым следуют шесть экземпляров CHAR (0). И обходной путь, который я опубликовал, определенно работает для меня:
DECLARE @foo TABLE(UserID VARCHAR(32));
INSERT @foo SELECT 0x31353831000000000000;
-- this succeeds:
SELECT CONVERT(INT, REPLACE(UserID, CHAR(0), '')) FROM @foo;
-- this fails:
SELECT CONVERT(INT, UserID) FROM @foo;
Пожалуйста, подтвердите, что этот код сам по себе (ну, в любом случае, первый SELECT
, в любом случае) работает для вас. Если это произойдет, ошибка, которую вы получаете, связана с другим нечисловым символом в другой строке (а если нет, то, возможно, у вас есть сборка, где определенная ошибка не была исправлена). Чтобы попытаться сузить его, вы можете принимать случайные значения из следующего запроса, а затем прокручивать символы:
SELECT UserID, CONVERT(VARBINARY(32), UserID)
FROM dbo.[audit]
WHERE UserID LIKE '%[^0-9]%';
Итак, возьмите случайную строку, а затем вставьте вывод в такой запрос:
DECLARE @x VARCHAR(32), @i INT;
SET @x = CONVERT(VARCHAR(32), 0x...); -- paste the value here
SET @i = 1;
WHILE @i <= LEN(@x)
BEGIN
PRINT RTRIM(@i) + ' = ' + RTRIM(ASCII(SUBSTRING(@x, @i, 1)))
SET @i = @i + 1;
END
Это может занять несколько проб и ошибок, прежде чем вы столкнетесь с какой-либо строкой, которая не работает по какой-либо другой причине, чем CHAR(0)
– поскольку вы не можете отфильтровывать строки, содержащие CHAR(0)
, потому что они могут содержать CHAR(0)
и CHAR(something else)
. Для всех, кого мы знаем, у вас есть значения в таблице, например:
SELECT '15' + CHAR(9) + '23' + CHAR(0);
… который также не может быть преобразован в целое число, заменили ли вы CHAR(0)
или нет.
Я знаю, что вы не хотите его слышать, но я действительно рад, что это очень больно для людей, потому что теперь у них больше военных историй, чтобы отбросить назад, когда люди принимают очень плохие решения о типах данных.
Ответ 2
Этот вопрос имеет 91 000 просмотров, поэтому, возможно, многие люди ищут более общее решение проблемы в заголовке “преобразование ошибок varchar в INT”
Если вы используете SQL Server 2012+, одним из способов обработки этих недопустимых данных является использование TRY_CAST
SELECT TRY_CAST (userID AS INT)
FROM audit
В предыдущих версиях вы могли использовать
SELECT CASE
WHEN ISNUMERIC(RTRIM(userID) + '.0e0') = 1
AND LEN(userID) <= 11
THEN CAST(userID AS INT)
END
FROM audit
Оба возвращают NULL
, если значение не может быть изменено.
В конкретном случае, который у вас есть в вашем вопросе с известными плохими значениями, я бы использовал следующее.
CAST(REPLACE(userID COLLATE Latin1_General_Bin, CHAR(0),'') AS INT)
Попытка заменить нулевой символ часто проблематична, за исключением случаев, когда используется двоичная сортировка.
Ответ 3
Я бы попробовал обрезать номер, чтобы узнать, что вы получаете:
select len(rtrim(ltrim(userid))) from audit
если это вернет правильное значение, просто выполните:
select convert(int, rtrim(ltrim(userid))) from audit
если это не возвращает правильное значение, тогда я сделал бы замену, чтобы удалить пустое пространство:
select convert(int, replace(userid, char(0), '')) from audit
Ответ 4
Это больше для кого-то Поиск результата, чем оригинал post-er. Это сработало для меня…
declare @value varchar(max) = 'sad';
select sum(cast(iif(isnumeric(@value) = 1, @value, 0) as bigint));
returns 0
declare @value varchar(max) = '3';
select sum(cast(iif(isnumeric(@value) = 1, @value, 0) as bigint));
returns 3
- Remove From My Forums
-
Question
-
Hi, I am working on a report which is off of survey information and I am using dynamic pivot on multiple columns.
I have questions like Did you use this parking tag for more than 250 hours? If yes specify number of hours.
and the answers could be No, 302, 279, No and so on….All these answers are of varchar datatype and all this data comes from a partner application where we consume this data for internal reporting.
When I am doing dynamic pivot I get the below error.
Error: Conversion failed when converting the varchar value ‘No’ to data type int.
Query
DECLARE @Cols1 VARCHAR(MAX), @Cols0 VARCHAR(MAX), @Total VARCHAR(MAX), @SQL VARCHAR(MAX) SELECT @Cols1 = STUFF((SELECT ', ' + QUOTENAME(Question) FROM Question GROUP BY Question FOR XML PATH('')),1,2,'') SELECT @Cols0 = (SELECT ', COALESCE(' + QUOTENAME(Question) + ',0) as ' + QUOTENAME(Question) FROM Question GROUP BY Question FOR XML PATH('')) SET @SQL = 'SELECT QID, QNAME' + @Cols0 + ' FROM (SELECT QID, QNAME, ANSWERS, Question FROM Question) T PIVOT (MAX(ANSWERS) FOR Question IN ('+@Cols1+')) AS P' EXECUTE (@SQL)
I am using SQL Server 2008 R2.
Please guide me to resolve this.
Thanks in advance……….
Ione
Answers
-
create table questions (QID int, QNAME varchar(50), ANSWERS varchar(500), Question varchar(50)) Insert into questions values(1,'a','b','c'), (2,'a2','b2','c2') DECLARE @Cols1 VARCHAR(MAX), @Cols0 VARCHAR(MAX), @Total VARCHAR(MAX), @SQL VARCHAR(MAX) SELECT @Cols1 = STUFF((SELECT ', ' + QUOTENAME(Question) FROM Questions GROUP BY Question FOR XML PATH('')),1,2,'') SELECT @Cols0 = (SELECT ', COALESCE(' + QUOTENAME(Question) + ',''0'') as ' + QUOTENAME(Question) FROM Questions GROUP BY Question FOR XML PATH('')) SET @SQL = 'SELECT QID, QNAME' + @Cols0 + ' FROM (SELECT QID, QNAME, ANSWERS, Question FROM Questions) T PIVOT (MAX(ANSWERS) FOR Question IN ('+@Cols1+')) AS P' EXECUTE (@SQL) drop table questions
-
Marked as answer by
Monday, February 9, 2015 4:59 PM
-
Marked as answer by
Доброго времени суток!
Есть три простые таблицы в базе Shop:
первая – All_buy с данными о товарах:
SQL | ||
|
вторая – tovar с видами товаров
SQL | ||
|
и третья Users – с пользователями, и разрешениями – в поле u_permission задано какие группы товаров они должны видеть – кто то должен видеть только товары 1-й группы, кто то только 45-й и 80-й и тд
SQL | ||
|
Я хочу выводить только те товары, которые может видеть пользователь например Stepanov, делаю так:
SQL | ||
|
SQL | ||
|
возвращает разрешения для Stepanov.
результат –
SQL | ||
|
но если написать вместо этого select
SQL | ||
|
то всё нормально выведет. Вопрос, почему не преобразуется поле , содержащее
‘1’,’2′.
Спасибо.