• Then again, there's always some schmo that's going to come along and try to beat it.

    SELECT TestNum, Jeff=CASE

    WHEN FLOOR(REVERSE(ABS(TestNum))) = 0.0

    THEN 0

    ELSE FLOOR(LOG10(REVERSE(ABS(TestNum)))+1) END

    ,Markus=CASE

    WHEN FLOOR(LOG10(REVERSE(ABS(TestNum)+1)))+1 < 0

    THEN 0 ELSE FLOOR(LOG10(REVERSE(ABS(TestNum)+1)))+1 END

    ,Dwain=CASE

    WHEN FLOOR(TestNum) = TestNum THEN 0

    ELSE LEN(CAST(REVERSE(ABS(TestNum) % 1) AS DECIMAL(38,0))) END

    ,DwainRedux=CASE

    WHEN FLOOR(TestNum) = TestNum THEN 0

    ELSE LEN(CAST(REVERSE(TestNum - CAST(FLOOR(TestNum) AS DECIMAL)) AS DECIMAL)) END

    FROM (

    SELECT CAST(99 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(99.1 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(99.11 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(99.111 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(99.1111 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(99.11111 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(99.111111 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(-99.11111 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(-99.111111 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(99.1111111111111111 AS DECIMAL(38,15))

    UNION ALL SELECT CAST(0.1 AS DECIMAL(38,15))) Nums(TestNum)

    CREATE TABLE #BigNums (TestNum DECIMAL(38,15))

    INSERT INTO #BigNums

    SELECT 1.* CHECKSUM(NEWID()) / POWER(10, ABS(CHECKSUM(NEWID())) % 10)

    FROM (

    SELECT TOP 1000000 1

    FROM sys.all_columns a, sys.all_columns b

    )Tally(n)

    DECLARE @Hold DECIMAL(38,15)

    PRINT 'Jeff'

    SET STATISTICS TIME ON

    SELECT @Hold=CASE

    WHEN FLOOR(REVERSE(ABS(TestNum))) = 0.0

    THEN 0

    ELSE FLOOR(LOG10(REVERSE(ABS(TestNum)))+1)

    END

    FROM #BigNums

    SET STATISTICS TIME OFF

    PRINT 'Markus'

    SET STATISTICS TIME ON

    SELECT @Hold=CASE

    WHEN FLOOR(LOG10(REVERSE(ABS(TestNum)+1)))+1 < 0

    THEN 0 ELSE FLOOR(LOG10(REVERSE(ABS(TestNum)+1)))+1 END

    FROM #BigNums

    SET STATISTICS TIME OFF

    PRINT 'Dwain'

    SET STATISTICS TIME ON

    SELECT @Hold=CASE

    WHEN FLOOR(TestNum) = TestNum THEN 0

    ELSE LEN(CAST(REVERSE(ABS(TestNum) % 1) AS DECIMAL(38,0))) END

    FROM #BigNums

    SET STATISTICS TIME OFF

    PRINT 'Dwain Redux'

    SET STATISTICS TIME ON

    SELECT @Hold=CASE

    WHEN FLOOR(TestNum) = TestNum THEN 0

    ELSE LEN(CAST(REVERSE(TestNum - CAST(FLOOR(TestNum) AS DECIMAL)) AS DECIMAL)) END

    FROM #BigNums

    SET STATISTICS TIME OFF

    PRINT 'Jeff - Revised WHEN'

    SET STATISTICS TIME ON

    SELECT @Hold=CASE

    WHEN FLOOR(TestNum) = TestNum

    THEN 0

    ELSE FLOOR(LOG10(REVERSE(ABS(TestNum)))+1)

    END

    FROM #BigNums

    SET STATISTICS TIME OFF

    DROP TABLE #BigNums

    Latest speed results:

    Jeff

    SQL Server Execution Times:

    CPU time = 3338 ms, elapsed time = 3408 ms.

    Markus

    SQL Server Execution Times:

    CPU time = 4337 ms, elapsed time = 4369 ms.

    Dwain

    SQL Server Execution Times:

    CPU time = 2012 ms, elapsed time = 2071 ms.

    Dwain Redux

    SQL Server Execution Times:

    CPU time = 1888 ms, elapsed time = 1928 ms.

    Jeff - Revised WHEN

    SQL Server Execution Times:

    CPU time = 2293 ms, elapsed time = 2362 ms.

    It appears that most of the speed boost was a result of the revision to the WHEN clause.


    My mantra: No loops! No CURSORs! No RBAR! Hoo-uh![/I]

    My thought question: Have you ever been told that your query runs too fast?

    My advice:
    INDEXing a poor-performing query is like putting sugar on cat food. Yeah, it probably tastes better but are you sure you want to eat it?
    The path of least resistance can be a slippery slope. Take care that fixing your fixes of fixes doesn't snowball and end up costing you more than fixing the root cause would have in the first place.

    Need to UNPIVOT? Why not CROSS APPLY VALUES instead?[/url]
    Since random numbers are too important to be left to chance, let's generate some![/url]
    Learn to understand recursive CTEs by example.[/url]
    [url url=http://www.sqlservercentral.com/articles/St