Почему я все еще получаю сообщение об ошибке при попытке конвертировать varchar в int? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь преобразовать эти данные в моей базе данных в int на основе приведенного ниже кода из другого потока. Поскольку я довольно новичок в SQL, я просто хотел попытаться преобразовать столбец «Web ID», чтобы понять код и не иметь слишком много ошибок.

database contents

Я использую следующий код, но все равно получаю ошибку:

select * 
into #tmp 
from [db].[desktop-order-data]

truncate table [db].[desktop-order-data]

alter table [db].[desktop-order-data] 
    alter column ["Web ID)"] int

insert [db].[desktop-order-data]
    select cast(["Web ID"] as int)
    from #tmp

drop table #tmp

Когда я запускаю это, я получаю эту ошибку:

Сообщение 213, Уровень 16, Состояние 1, Строка 4
Имя столбца или количество предоставленных значений не соответствует определению таблицы.

Я немного сбит с толку, так как все еще ссылаюсь на ту же таблицу, что и в запросе. На что мне здесь ссылаться?

Ответы [ 4 ]

0 голосов
/ 14 января 2019

Вы получаете эту ошибку, потому что в [desktop-order-data] имеется более одного столбца, и вы пытаетесь вставить только 1 столбец, не указывая целевой столбец. Просто измените ваш оператор вставки на:

INSERT INTO [db].[desktop-order-data] ([Web ID])
SELECT CAST(["Web ID"] as int)
FROM #tmp
0 голосов
/ 14 января 2019

Диапазон для int:

-2 ^ 31 (-2 147 483 648) до 2 31-1 (2 147 483 647)

Ваши Web ID числа имеют длину 10 цифр и начинаются с 4 - они не подходят.

Вместо этого вы можете попробовать bigint.

0 голосов
/ 14 января 2019

Нельзя вписать число порядка 4363155167 в int, которое идет от -2147483648 до 2147483647. Можете ли вы использовать bigint здесь?

0 голосов
/ 14 января 2019

Вы просто должны быть в состоянии сделать:

alter table [db].[desktop-order-data] alter column ["Web ID"] int;

Для вашего кода вы хотите update, а не insert. Вам не нужен временный стол. Просто сделай:

update [db].[desktop-order-data]
    set ["Web ID"] = cast(["Web ID"] as int);

Если это вызывает проблемы, найдите строки, которые не конвертируются. В SQL Server вы можете сделать:

select d.*
from [db].[desktop-order-data] d
where try_cast(["Web ID"] as int) is null and ["Web ID"] is not null;

Если у вас на самом деле двойные кавычки вокруг значений, то вам нужно удалить их. Я бы порекомендовал:

-- remove double quotes
update [db].[desktop-order-data] d
    set ["Web ID"] = replace(["Web ID"], '"', '');

-- check that the resulting values are convertible
select *
from db].[desktop-order-data] d
where try_cast(["Web ID"] as int) is null and ["Web ID"] is not null;

-- if the above query returns no rows, then

update [db].[desktop-order-data]
    set ["Web ID"] = cast(["Web ID"] as int);
...