Мне нужно проверить количество цифр справа от десятичной дроби (шкала)
0, это допустимое число в любом месте (десятые, сотые, тысячные и т. Д.).
Какие-нибудь советы или хитрости? ... без обширной библиотеки регулярных выражений и без встроенной функции, я бы предпочел функцию, которая принимает число, количество мест, которое должен равняться шкале, а затем возвращаетбит.
Следуя предложению Мейсс, я придумал следующее:
CREATE FUNCTION [dbo].[GetScale]
(
@tsValue varchar(250)
, @tiScale int
)
RETURNS int
AS
BEGIN
DECLARE
@tiResult int
, @tiValueScale int
SET @tiResult = 0
SELECT @tiValueScale = LEN( SUBSTRING ( @tsValue, PATINDEX('%.%', @tsValue) + 1, LEN(@tsValue) ) )
IF (@tiValueScale = @tiScale)
SET @tiResult = 1
RETURN @tiResult
END
GO
Кажется, работает как нужно.Спасибо за помощь.
Так же, как продолжение ... я столкнулся с проблемой, когда число не имеет десятичной дроби (которая возвращает patindex в 0), и число было того же размера, что и масштаб, оновернул бы ложное срабатывание ... поэтому я добавляю дополнительный выбор из patindex, чтобы определить, существует он или нет ... теперь это выглядит так:
- =============================================
ALTER FUNCTION [dbo].[GetScale]
(
@tsValue varchar(250)
, @tiScale int
)
RETURNS int
AS
BEGIN
DECLARE
@tiResult int
, @tiValueScale int
, @tiDecimalExists int
SET @tiResult = 0
SET @tiDecimalExists = 0
SELECT @tiDecimalExists = PATINDEX('%.%', @tsValue)
IF (@tiDecimalExists != 0)
BEGIN
SELECT @tiValueScale = LEN( SUBSTRING ( @tsValue, @tiDecimalExists + 1, LEN(@tsValue) ) )
IF (@tiValueScale = @tiScale)
SET @tiResult = 1
END
RETURN @tiResult
END