• Try the Parsename function. Not what is was made for, but works quite well for what you need and is much faster that CharIndex and Len.

    Duration for CHARINDEX = 00:00:00:933

    Duration for Len = 00:00:00:607

    Duration for PARSENAME = 00:00:00:127

    SET NOCOUNT ON;

    IF object_id('tempdb..#testEnvironment') IS NOT NULL

    BEGIN

    DROP TABLE #testEnvironment;

    END;

    --1,000,000 Random rows of data

    SELECT IDENTITY(INT,1,1) AS ID, CAST(LEFT(yourData, LEN(yourData) - 1) AS varchar(50)) AS yourData

    INTO #testEnvironment

    FROM (SELECT TOP 1000000

    REPLICATE(

    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(

    REPLACE(NEWID(),'-','')

    ,'0',''),'9',''),'8',''),'7',''),'6',''),'5',''),'4',''),'3',''),'2',''),'1','') + '.',

    (ABS(CHECKSUM(NEWID())) % 2) + 2)

    FROM master.dbo.syscolumns sc1, master.dbo.syscolumns sc2, master.dbo.syscolumns sc3

    )a(yourData);

    --select * from #testEnvironment where PARSENAME(yourData,3) is null --00:00:48:00

    DECLARE @HOLDER INT, @Duration CHAR(12), @StartTime DATETIME;

    SELECT @StartTime = GETDATE();

    SELECT @HOLDER = ID

    FROM #testEnvironment

    WHERE CHARINDEX('.', yourData, CHARINDEX('.', yourData) + 1) = 0;

    SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);

    RAISERROR('Duration for CHARINDEX = %s',0,1,@Duration) WITH NOWAIT;

    SELECT @StartTime = SYSDATETIME();

    SELECT @HOLDER = ID

    FROM #testEnvironment

    WHERE LEN(CAST(yourData AS NVARCHAR(MAX)))-1 = LEN(REPLACE(CAST(yourData AS NVARCHAR(MAX)) COLLATE Latin1_General_BIN2,'.',''));

    SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);

    RAISERROR('Duration for Len = %s',0,1,@Duration) WITH NOWAIT;

    SELECT @StartTime = SYSDATETIME();

    select @HOLDER = ID from #testEnvironment where PARSENAME(yourData,3) is null

    SELECT @Duration = CONVERT(CHAR(12),GETDATE()-@StartTime,114);

    RAISERROR('Duration for PARSENAME = %s',0,1,@Duration) WITH NOWAIT;