Это зависит от приложения и цели. Когда высокая доступность и производительность не очень важны, это не плохо к не разделить DB и веб-сервер. Особенно рассматривая увеличение производительности - если appliation делает большую сумму запросов базы данных, значительная сумма сетевой нагрузки может быть удалена путем хранения всего этого в той же системе, поддержания времени отклика на низком уровне.
select * from table
where column_value not like '[^0-9]'
Если разрешены отрицательные целые числа, вам понадобится что-то вроде
where column_value like '[+-]%'
and substring(column_value,patindex('[+-]',substring(column_value,1))+1,len(column_value))
not like '[^0-9]'
. Вам понадобится больше кода, если значение_столбца может быть целым числом, превышающим пределы типа "int", и вы хотите исключить такие случаях.
Здесь, если вы хотите реализовать свою пользовательскую функцию,
CREATE Function dbo.IsInteger(@Value VARCHAR(18))
RETURNS BIT
AS
BEGIN
RETURN ISNULL(
(SELECT CASE WHEN CHARINDEX('.', @Value) > 0 THEN
CASE WHEN CONVERT(int, PARSENAME(@Value, 1)) <> 0 THEN 0 ELSE 1 END
ELSE 1
END
WHERE ISNUMERIC(@Value + 'e0') = 1), 0)
END
ISNUMERIC возвращает 1, когда ввод выражение оценивается как допустимое целое число, число с плавающей запятой, деньги или десятичный тип ; в противном случае он возвращается 0. Возвращаемое значение 1 гарантирует, что выражение может быть преобразовано в одно из эти числовые типы.
Я бы сделал UDF, как предлагает Светлозар Ангелов, но сначала проверил бы ISNUMERIC (и вернул бы 0, если нет), а затем проверил бы column_value% 1 = 0
, чтобы узнать, является ли это целым числом.
Вот как может выглядеть тело. Вы должны поместить логику по модулю в отдельную ветку, потому что она вызовет исключение, если значение не является числовым.
DECLARE @RV BIT
IF ISNUMERIC(@value) BEGIN
IF CAST(@value AS NUMERIC) % 1 = 0 SET @RV = 1
ELSE SET @RV = 0
END
ELSE SET @RV = 0
RETURN @RV