Quantcast
Channel: SQL Server Business Intelligence and Big Data | BI-BIGDATA.com » ssrs report
Viewing all articles
Browse latest Browse all 4

Convert Number Value Into Words using SSRS

$
0
0

For Display Amount Value into Words with SQL Reporting Services 2008, we can implement the same with following two ways.

· Database Function

· Custom Assembly

Here is small try to explain how we can archive this with Database Function.

First need to write function that will take one parameter as number & will return string.

CREATE FUNCTION dbo.udf_Num_ToWords
(
@Number Numeric (38, 0) -- Input number with as many as 18 digits
) RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE @inputNumber VARCHAR(38),
@outputString VARCHAR(8000),
@length INT ,
@counter INT,
@loops INT,
@position INT,
@chunk CHAR(3), -- for chunks of 3 numbers
@tensones CHAR(2),
@hundreds CHAR(1),
@tens CHAR(1),
@ones CHAR(1)
DECLARE @NumbersTable TABLE (number CHAR(2), word VARCHAR(10))

IF @Number = 0 Return 'Zero'

-- initialize the variables
SELECT
@inputNumber = CONVERT(varchar(38), @Number)
, @outputString = ''
, @counter = 1
SELECT
@length = LEN(@inputNumber)
, @position = LEN(@inputNumber) - 2
, @loops = LEN(@inputNumber)/3

-- make sure there is an extra loop added for the remaining numbers
IF LEN(@inputNumber) % 3 <> 0 SET @loops = @loops + 1

-- insert data for the numbers and words
INSERT INTO @NumbersTable SELECT '00', ''
UNION ALL SELECT '01', 'one' UNION ALL SELECT '02', 'two'
UNION ALL SELECT '03', 'three' UNION ALL SELECT '04', 'four'
UNION ALL SELECT '05', 'five' UNION ALL SELECT '06', 'six'
UNION ALL SELECT '07', 'seven' UNION ALL SELECT '08', 'eight'
UNION ALL SELECT '09', 'nine' UNION ALL SELECT '10', 'ten'
UNION ALL SELECT '11', 'eleven' UNION ALL SELECT '12', 'twelve'
UNION ALL SELECT '13', 'thirteen' UNION ALL SELECT '14', 'fourteen'
UNION ALL SELECT '15', 'fifteen' UNION ALL SELECT '16', 'sixteen'
UNION ALL SELECT '17', 'seventeen' UNION ALL SELECT '18', 'eighteen'
UNION ALL SELECT '19', 'nineteen' UNION ALL SELECT '20', 'twenty'
UNION ALL SELECT '30', 'thirty' UNION ALL SELECT '40', 'forty'
UNION ALL SELECT '50', 'fifty' UNION ALL SELECT '60', 'sixty'
UNION ALL SELECT '70', 'seventy' UNION ALL SELECT '80', 'eighty'
UNION ALL SELECT '90', 'ninety'

WHILE @counter <= @loops
BEGIN
-- get chunks of 3 numbers at a time, padded with leading zeros
SET @chunk = RIGHT('000' + SUBSTRING(@inputNumber, @position, 3), 3)
IF @chunk <> '000'
BEGIN
SELECT
@tensones = SUBSTRING(@chunk, 2, 2)
, @hundreds = SUBSTRING(@chunk, 1, 1)
, @tens = SUBSTRING(@chunk, 2, 1)
, @ones = SUBSTRING(@chunk, 3, 1)

-- If twenty or less, use the word directly from @NumbersTable
IF CONVERT(INT, @tensones) <= 20 OR @Ones='0'
BEGIN
SET
@outputString = (SELECT word FROM @NumbersTable WHERE @tensones = number)+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN ' thousand ' WHEN 3 THEN ' million '
WHEN 4 THEN ' billion ' WHEN 5 THEN ' trillion '
WHEN 6 THEN ' quadrillion ' WHEN 7 THEN ' quintillion '
WHEN 8 THEN ' sextillion ' WHEN 9 THEN ' septillion '
WHEN 10 THEN ' octillion ' WHEN 11 THEN ' nonillion '
WHEN 12 THEN ' decillion ' WHEN 13 THEN ' undecillion '
ELSE '' END + @outputString
END
ELSE BEGIN -- break down the ones and the tens separately
SET @outputString = ' ' + (SELECT word FROM @NumbersTable WHERE @tens + '0' = number)
+ '-' + (SELECT word
FROM
@NumbersTable
WHERE
'0'+ @ones = number)
+ CASE @counter WHEN 1 THEN '' -- No name
WHEN 2 THEN ' thousand ' WHEN 3 THEN ' million '
WHEN 4 THEN ' billion ' WHEN 5 THEN ' trillion '
WHEN 6 THEN ' quadrillion ' WHEN 7 THEN ' quintillion '
WHEN 8 THEN ' sextillion ' WHEN 9 THEN ' septillion '
WHEN 10 THEN ' octillion ' WHEN 11 THEN ' nonillion '
WHEN 12 THEN ' decillion ' WHEN 13 THEN ' undecillion '
ELSE '' END + @outputString
END

-- now get the hundreds
IF @hundreds <> '0'
BEGIN
SET
@outputString = (SELECT word FROM @NumbersTable
WHERE
'0' + @hundreds = number)+ ' hundred ' + @outputString
END
END

SELECT
@counter = @counter + 1
, @position = @position - 3

END

-- Remove any double spaces
SET @outputString = LTRIM(RTRIM(REPLACE(@outputString, ' ', ' ')))
SET @outputstring = UPPER(LEFT(@outputstring, 1)) + SUBSTRING(@outputstring, 2, 8000)

RETURN @outputString -- return the result
END
GO

GRANT EXEC on dbo.udf_Num_ToWords TO PUBLIC
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Then just call this function in your dataset query along with your requirements

SELECT dbo.udf_Num_ToWords (345)

This is the result: Three hundred  forty-five

Hope this will help someone…

Thanks

Sandip Shinde


Filed under: Business Intelligence, SQL Server, SSRS

Viewing all articles
Browse latest Browse all 4

Trending Articles