Ошибка преобразования значения varchar в тип данных int sql server как исправить

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

Я застрял при преобразовании 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

4b9b3361

Ответ 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

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

Доброго времени суток!

Есть три простые таблицы в базе Shop:

первая – All_buy с данными о товарах:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(
 tovar_id INTEGER  IDENTITY (1,1) NOT NULL PRIMARY KEY,
 date_buy datetime NOT NULL,
 t_id INTEGER NOT NULL REFERENCES tovar(t_id),
);
 
  tovar_id |   date_buy     |t_id
----------------------------------
      1    |   2012-01-01   |  1
----------------------------------
      2    |   2012-02-02   |  2
----------------------------------
      3    |   2013-02-02   |  8
..................................

вторая – tovar с видами товаров

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
(
 t_id INTEGER  IDENTITY (1,1) NOT NULL PRIMARY KEY,
 t_name VARCHAR(50)NOT NULL
);
 
t_id       |   t_name   
----------------------------------
      1    |    fridge
----------------------------------
      2    |   iron  
----------------------------------
      3    |   kettle
..................................

и третья Users – с пользователями, и разрешениями – в поле u_permission задано какие группы товаров они должны видеть – кто то должен видеть только товары 1-й группы, кто то только 45-й и 80-й и тд

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(
 u_id INTEGER  IDENTITY (1,1) NOT NULL PRIMARY KEY,
 u_name VARCHAR(50)    NOT NULL
 u_permission VARCHAR(50)    NOT NULL
);
 
u_id       |    u_name      |  u_permisson
---------------------------------------------
      1    |   Stepanov     |     '1','2' 
--------------------------------------------
      2    |   Sergeev      |      '2','4'
--------------------------------------------
      3    |   Pavlov       |    '34','76' 
..................................

Я хочу выводить только те товары, которые может видеть пользователь например Stepanov, делаю так:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT          [shop].[dbo].[all_buy].[tov_id]
               ,[shop].[dbo].[all_buy].[date_buy]
               ,[shop].[dbo].[tovar].[t_name]
FROM [shop].[dbo].[all_buy],[shop].[dbo].[tovar]
 
WHERE 
 ([shop].[dbo].[tovar].[t_id]=[shop].[dbo].[all_buy].[t_id])
 
AND
 [shop].[dbo].[all_buy].[t_id] IN
 (SELECT [shop].[dbo].[users].[u_permission] FROM [shop].[dbo].[users] 
  WHERE [shop].[dbo].[users].[u_name]='Stepanov')
SQL
1
2
(SELECT [shop].[dbo].[users].[u_permission] FROM [shop].[dbo].[users] 
  WHERE [shop].[dbo].[users].[u_name]='Stepanov')

возвращает разрешения для Stepanov.
результат –

SQL
1
Ошибка преобразования значения VARCHAR "'1','2'" в тип данных INT.

но если написать вместо этого select

SQL
1
2
AND
 [shop].[dbo].[all_buy].[t_id] IN ('1','2')

то всё нормально выведет. Вопрос, почему не преобразуется поле , содержащее
‘1’,’2′.
Спасибо.

Добавить комментарий