Рейтинг:
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 или значение, которое не может быть преобразовано в целое число? Ой.