Another way, up to BIGINTs only
DECLARE @num BIGINT = 985;
WITH Tens(Pos,Val) AS (
SELECT 1, CAST(1 AS BIGINT) UNION ALL
SELECT 2, CAST(10 AS BIGINT) UNION ALL
SELECT 3, CAST(100 AS BIGINT) UNION ALL
SELECT 4, CAST(1000 AS BIGINT) UNION ALL
SELECT 5, CAST(10000 AS BIGINT) UNION ALL
SELECT 6, CAST(100000 AS BIGINT) UNION ALL
SELECT 7, CAST(1000000 AS BIGINT) UNION ALL
SELECT 8, CAST(10000000 AS BIGINT) UNION ALL
SELECT 9, CAST(100000000 AS BIGINT) UNION ALL
SELECT 10,CAST(1000000000 AS BIGINT) UNION ALL
SELECT 11,CAST(10000000000 AS BIGINT) UNION ALL
SELECT 12,CAST(100000000000 AS BIGINT) UNION ALL
SELECT 13,CAST(1000000000000 AS BIGINT) UNION ALL
SELECT 14,CAST(10000000000000 AS BIGINT) UNION ALL
SELECT 15,CAST(100000000000000 AS BIGINT) UNION ALL
SELECT 16,CAST(1000000000000000 AS BIGINT) UNION ALL
SELECT 17,CAST(10000000000000000 AS BIGINT) UNION ALL
SELECT 18,CAST(100000000000000000 AS BIGINT) UNION ALL
SELECT 19,CAST(1000000000000000000 AS BIGINT))
SELECT SUM((@num / Val) % 10)
FROM Tens
WHERE Val<=@num;
____________________________________________________
Deja View - The strange feeling that somewhere, sometime you've optimised this query before
How to get the best help on a forum
http://www.sqlservercentral.com/articles/Best+Practices/61537