Kwota słownie - konieczna do umieszczenia na fakturach. Czy SQL Server zrealizuje takie zadanie w sposób wydajny? Czy zawsze będzie bardziej wydajna metoda realizowania tego w aplikacji po stronie klienta?
Kwota słownie - konieczna do umieszczenia na fakturach. Czy SQL Server zrealizuje takie zadanie w sposób wydajny? Czy zawsze będzie bardziej wydajna metoda realizowania tego w aplikacji po stronie klienta?
W przypadku SQL Server można zrealizować to zadanie za pomocą T-SQLa lub SQL CLRa, ocena wydajności może być jednak dokonana wyłącznie w sprecyzowanych warunkach (infrastruktura, konfiguracja, środowisko, implementacja, dane).
Przykładową implementację w T-SQL można oprzeć o tabelę słownikową oraz funkcję.
Przykład tabeli (oraz części danych):
CREATE TABLE [dbo].[Liczby] ( Liczba INTEGER NOT NULL UNIQUE, Slowo [nvarchar](25) NOT NULL ) GO INSERT INTO [Liczby] VALUES ( 0, 'zero') INSERT INTO [Liczby] VALUES( 1, 'jeden') INSERT INTO [Liczby] VALUES( 2, 'dwa') INSERT INTO [Liczby] VALUES( 3, 'trzy') INSERT INTO [Liczby] VALUES( 4, 'cztery') INSERT INTO [Liczby] VALUES( 5, 'pięć') INSERT INTO [Liczby] VALUES( 6, 'sześć') INSERT INTO [Liczby] VALUES( 7, 'siedem') INSERT INTO [Liczby] VALUES( 8, 'osiem') INSERT INTO [Liczby] VALUES( 9, 'dziewięć') INSERT INTO [Liczby] VALUES( 10, 'dziesięć') INSERT INTO [Liczby] VALUES( 20, 'dwadzieścia') INSERT INTO [Liczby] VALUES( 30, 'trzydzieści') INSERT INTO [Liczby] VALUES( 40, 'czterdzieści') INSERT INTO [Liczby] VALUES( 50, 'pięćdziesiąt') INSERT INTO [Liczby] VALUES( 100, 'sto')
Przykład funkcji:
CREATE FUNCTION dbo.ToWords ( @num AS INTEGER ) RETURNS NVARCHAR(50) AS BEGIN DECLARE @words AS NVARCHAR(255) IF @num < 0 SELECT @words = 'BLAD' ELSE IF @num < 20 SELECT @words = Slowo FROM Liczby WHERE Liczba = @num ELSE IF @num < 100 (SELECT @words = TDz.Slowo + ' ' + TJedn.Slowo FROM Liczby AS TJedn CROSS JOIN Liczby AS TDz WHERE TJedn.Liczba = (@num % 100) % 10 AND TDz.Liczba = (@num % 100) - (@num % 100) % 10) ELSE IF @num = 100 SELECT @words = Slowo FROM Liczby WHERE Liczba = @num ELSE SELECT @words = STR(@num) RETURN @words END GO
Wywołanie:
SELECT dbo.ToWords(5); SELECT dbo.ToWords(38); SELECT dbo.ToWords(55); SELECT dbo.ToWords(100);