SQL SQERVER Sayıyı Yazı ile Yazma

SQL SQERVER Sayıyı Yazı ile Yazma

SQL Server’da Sayıları Yazıya Çevirme (T-SQL Fonksiyonu)

Finansal raporlar, fatura işlemleri veya çek yazımı gibi işlemler sırasında, sayısal verileri metin formatında göstermek gerekebilir. Özellikle para birimlerini tam metin olarak yazdırmak, yanlış anlaşılmaları önlemek için önemlidir.

Bu yazımda, SQL Server’da sayıları yazıya çevirmek için özel olarak hazırladığım T-SQL fonksiyonlarını paylaşacağım. Bu fonksiyonlar sayesinde 1853768,55 gibi bir tutarı “Bir Milyon Sekiz Yüz Elli Üç Bin Yedi Yüz Altmış Sekiz TL Elli Beş Kuruş” şeklinde metin olarak elde edebilirsiniz.

Kodlar, tam sayıları ve ondalık (kuruş) kısmını ayrı ayrı işleyerek, Türk Lirası ve kuruş formatına uygun bir çıktı üretiyor. Ayrıca büyük sayılar için milyar, milyon, bin gibi ifadeleri de destekliyor. Eğer finansal verilerinizi SQL Server’da doğrudan metne çevirmek istiyorsanız, bu fonksiyonları kendi sistemlerinize kolayca entegre edebilirsiniz.

1. Sayıyı Yazıya Çeviren Fonksiyon

CREATE FUNCTION dbo.TutarYaziyla (@Tutar MONEY)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @ParaBölüm NVARCHAR(4000)
    DECLARE @KurusBölüm NVARCHAR(50)
    DECLARE @TamSayiBölüm BIGINT
    DECLARE @OndalikBölüm INT

    -- Tam sayı ve kuruş kısmını ayır
    SET @TamSayiBölüm = FLOOR(@Tutar)
    SET @OndalikBölüm = CAST((@Tutar - @TamSayiBölüm) * 100 AS INT)

    -- Tam sayı kısmını yazıya çevir
    IF @TamSayiBölüm > 0
        SET @ParaBölüm = dbo.SayiYaziyla(@TamSayiBölüm) + ' TL'
    ELSE
        SET @ParaBölüm = 'Sıfır TL'

    -- Kuruş kısmını yazıya çevir
    IF @OndalikBölüm > 0
        SET @KurusBölüm = ' ' + dbo.SayiYaziyla(@OndalikBölüm) + ' Kuruş'
    ELSE
        SET @KurusBölüm = ''

    -- Sonucu döndür
    RETURN LTRIM(RTRIM(@ParaBölüm + @KurusBölüm))
END

2. Sayıyı Kelimeye Çeviren Yardımcı Fonksiyon

CREATE FUNCTION dbo.SayiYaziyla (@Sayi BIGINT)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @Yazi NVARCHAR(MAX) = ''
    DECLARE @Birlikler TABLE (Num INT, Kelime NVARCHAR(20))
    DECLARE @Onluklar TABLE (Num INT, Kelime NVARCHAR(20))
    DECLARE @Basamaklar TABLE (Num INT, Kelime NVARCHAR(20))

    -- Birlikler
    INSERT INTO @Birlikler VALUES (1, 'Bir'), (2, 'İki'), (3, 'Üç'), (4, 'Dört'), (5, 'Beş'), 
                                   (6, 'Altı'), (7, 'Yedi'), (8, 'Sekiz'), (9, 'Dokuz')
    -- Onluklar
    INSERT INTO @Onluklar VALUES (10, 'On'), (20, 'Yirmi'), (30, 'Otuz'), (40, 'Kırk'), (50, 'Elli'), 
                                  (60, 'Altmış'), (70, 'Yetmiş'), (80, 'Seksen'), (90, 'Doksan')
    -- Basamak Adları
    INSERT INTO @Basamaklar VALUES (100, 'Yüz'), (1000, 'Bin'), (1000000, 'Milyon'), (1000000000, 'Milyar')

    -- Sayıyı işle
    DECLARE @GeçiciSayi BIGINT = @Sayi
    DECLARE @Basamak INT
    DECLARE @Kelime NVARCHAR(50)
    DECLARE @Sira INT = 0

    WHILE @GeçiciSayi > 0
    BEGIN
        SET @Basamak = @GeçiciSayi % 1000
        SET @GeçiciSayi = @GeçiciSayi / 1000

        IF @Basamak > 0
        BEGIN
            SET @Kelime = ''

            -- **Yüzler Basamağı Düzeltilmiş**
            IF @Basamak >= 100
            BEGIN
                SELECT @Kelime = Kelime FROM @Birlikler WHERE Num = (@Basamak / 100)
                IF @Kelime = 'Bir' SET @Kelime = ''
                SET @Kelime = @Kelime + ' Yüz'
                SET @Basamak = @Basamak % 100
            END

            -- **Onlar Basamağı**
            IF @Basamak >= 10
            BEGIN
                SELECT @Kelime = @Kelime + ' ' + Kelime FROM @Onluklar WHERE Num = (@Basamak / 10) * 10
                SET @Basamak = @Basamak % 10
            END

            -- **Birler Basamağı**
            IF @Basamak > 0
                SELECT @Kelime = @Kelime + ' ' + Kelime FROM @Birlikler WHERE Num = @Basamak

            -- **Bin, Milyon gibi ekler**
            IF @Sira = 1 AND @Kelime = ' Bir' 
                SET @Kelime = 'Bin'
            ELSE IF @Sira > 0
                SELECT @Kelime = @Kelime + ' ' + Kelime FROM @Basamaklar WHERE Num = POWER(1000, @Sira)

            -- Sonuca ekle
            SET @Yazi = @Kelime + ' ' + @Yazi
        END

        SET @Sira = @Sira + 1
    END

    RETURN LTRIM(RTRIM(@Yazi))
END

Kullanımı:

SELECT dbo.TutarYaziyla(121000) AS Sonuc  -- ✅ "Yüz Yirmi Bir Bin TL"
SELECT dbo.TutarYaziyla(1100) AS Sonuc    -- ✅ "Bin Yüz TL"
SELECT dbo.TutarYaziyla(1000) AS Sonuc    -- ✅ "Bin TL"
SELECT dbo.TutarYaziyla(1000000) AS Sonuc -- ✅ "Bir Milyon TL"
SELECT dbo.TutarYaziyla(1234.56) AS Sonuc -- ✅ "Bin İki Yüz Otuz Dört TL Elli Altı Kuruş"
SELECT dbo.TutarYaziyla(0.50) AS Sonuc    -- ✅ "Sıfır TL Elli Kuruş"

 

Bu gönderiyi paylaş

Comments (1)

  • durali cevap

    Denedim çalışıyor, teşekkürler Turgay Acar.

    Mart 7, 2025 , 9:38 am

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir