0

金額を数値で入力した後、自動的に金額を単語で取得する必要があります。

例: 2500 と入力すると、次のフィールドに 2500 として自動的に挿入されます。

説明付きのSQL Server plsガイドで可能ですか。ありがとう。

4

2 に答える 2

1

以下の関数を使用して、単語に変換してください。

        CREATE FUNCTION [dbo].[Currency_ToWords] (
            @Input Numeric (38) -- Input number with as many as 18 digits

        ) RETURNS VARCHAR(8000) 

        /*
        * Converts a integer number as large as 34 digits into the 
        * equivalent words.  The first letter is capitalized.
        *
        * Attribution: Based on NumberToWords by Srinivas Sampath
        *        as revised by Nick Barclay
        *
        * Example:
        select dbo.udf_Num_ToWords (1234567890) + CHAR(10)
              +  dbo.udf_Num_ToWords (0) + CHAR(10)
              +  dbo.udf_Num_ToWords (123) + CHAR(10)
        select dbo.udf_Num_ToWords(76543210987654321098765432109876543210)

        DECLARE @i numeric (38,0)
        SET @i = 0
        WHILE @I <= 1000 BEGIN 
            PRINT convert (char(5), @i)  
                    + convert(varchar(255), dbo.udf_Num_ToWords(@i)) 
            SET @I  = @i + 1 
        END
        *
        * Published as the T-SQL UDF of the Week Vol 2 #9 2/17/03
        ****************************************************************/
        AS BEGIN
        Declare @Number Numeric(38,0)
        set @Number = @Input
        Declare @Cents as int
        set @Cents = 100*Convert(money,(@Input - convert(Numeric(38,3),@Number)))
        DECLARE @inputNumber VARCHAR(38)
        DECLARE @NumbersTable TABLE (number CHAR(2), word VARCHAR(10))
        DECLARE @outputString VARCHAR(8000)
        DECLARE @length INT
        DECLARE @counter INT
        DECLARE @loops INT
        DECLARE @position INT
        DECLARE @chunk CHAR(3) -- for chunks of 3 numbers
        DECLARE @tensones CHAR(2)
        DECLARE @hundreds CHAR(1)
        DECLARE @tens CHAR(1)
        DECLARE @ones CHAR(1)

        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 UPPER(@outputString)   -- return the result
        END

例: SELECT dbo.Currency_ToWords(2500)

出力: 二千五百

于 2012-10-31T08:19:09.730 に答える
0

最善の解決策は、数値を単語に変換するロジックを実装する関数を作成することだと思います。例として、このロジックの例がオンラインにあります

次に、数値を格納し、計算フィールドを使用して文字列値を取得します。計算フィールドは新しい関数を呼び出して数値列を渡します。結果は数値の文字列表現になります。

計算フィールドのリファレンスについては、http: //msdn.microsoft.com/en-us/library/ms191250 (v=sql.105).aspx を参照してください。

関数の作成に関するリファレンスについては、こちらをご覧ください: http://msdn.microsoft.com/en-us/library/ms186755.aspx

于 2012-10-31T07:19:48.520 に答える