jhovyn Ответов: 2

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


Я получил ошибку "преобразование не удалось при преобразовании значения varchar 'Id' в тип данных int"....

Что я уже пробовал:

SELECT *
FROM History
INNER JOIN Header
ON History.Id = Header.docId

2 Ответов

Рейтинг:
5

Karthik_Mahalingam

проверить это

 declare @History table (Id varchar(50),Name varchar(50))
declare @Header table (docId int,Name varchar(50))
insert into @History(id,name)values( 'id', 'a')
insert into @History(id,name)values( '2', 'a')

insert into @Header(docId,name)values( '2', 'a1')
insert into @Header(docId,name)values( '2', 'b1')

 
 select * from (  (SELECT * FROM @History where ISNUMERIC(id) =1 ) hi   INNER JOIN @Header he ON  hi.id = he.docId )


использовать ISNUMERIC (Transact-SQL)[^] чтобы проверить, является ли значение допустимым числом или нет


Richard Deeming

ISNUMERIC считает многие нечисловые строки числовыми - например, ',', '.', '-', прием.

Для SQL 2012 или выше было бы лучше использовать TRY_PARSE[^]:

SELECT * FROM @History hi INNER JOIN @Header he ON he.docId = TRY_PARSE(hi.id As int)

Для более старых версий простой NOT LIKE сравнение более надежно для базовых целых чисел:
WHERE Id NOT LIKE '%[^0-9]%'

Karthik_Mahalingam

Спасибо за информацию Ричард

Рейтинг:
13

Dave Kreskowiak

Ошибка дает вам всю необходимую информацию для устранения этой проблемы. В одной таблице у вас есть столбец ID, который содержит числовое значение, целое число. В другой таблице столбец ID представляет собой строку символов. Вы не можете объединить два разных типа данных.

Вы можете поместить неявное преобразование в столбец varchar, чтобы оно соответствовало целому числу в другом столбце, но поскольку преобразование должно применяться к каждому значению в столбце varchar ID, операция соединения будет довольно медленной. Кроме того, что делать, если в столбце ID есть NULL или значение, которое не может быть преобразовано в целое число? Ой.