4 Stimmen

Best practice für die Rechtsausrichtung einer Nummer in TSQL

Was ist die beste Methode, um eine Zahl in TSQL rechtsbündig auszurichten?

Ich muss eine Datei im festen Längenformat formatieren und die numerischen Felder rechtsbündig haben. (Ich benutze SQL Server 2005)

Ich habe dieses gefunden, das ziemlich einfach erscheint.

right('            '+convert(varchar(20),a.num),12)

Hier ist die vollständige SELECT-Anweisung

select
    a.num,
    fixed_number =
        right('            '+convert(varchar(20),a.num),12)
from
    (
    --Testdaten
    select num = 2400.00    union all
    select num = 385.00 union all
    select num = 123454.34
    ) a

Ergebnisse:

num        fixed_number 
---------- ------------ 
2400.00         2400.00
385.00           385.00
123454.34     123454.34

(3 Zeile(n) betroffen)

Ich stelle diese Frage, weil ich diese Codezeile bei der Arbeit gefunden habe, die unglaublich komplex erscheint (Sie entfernt auch das Dezimalzeichen und füllt mit Nullen auf)

CAST(REPLACE(REPLICATE('0', 12 - LEN(REPLACE(CAST(CONVERT(DECIMAL(10,2),@DD8DBAMT) AS VARCHAR),'.',''))) 
+ CAST(CONVERT(DECIMAL(10,2),@DD8DBAMT) AS VARCHAR),'.','') AS VARCHAR(12))

Aktualisiert:

Daniel Pratts Idee, eine Funktion zu verwenden, hat mich dazu gebracht, SQL# (das wir besitzen) zu betrachten. Es hat eine Funktion namens PadLeft, die überraschenderweise die gleichen Parameter und Funktionen wie Daniel Pratts fn_PadRight Funktion in seiner unten stehenden Antwort hatte.

So verwenden Sie die SQL#-Funktion:

DECLARE @F6D2 AS DECIMAL(8,2)
SET @F6D2 = 0
SQL#.String_PadLeft(@F6D2,9,' ')
SQL#.String_PadLeft(123.400,9,' ')
SQL#.String_PadLeft('abc',9,' ')

Es kann sowohl Zahlen als auch Zeichenfolgen verwenden.

2voto

JoshBerke Punkte 64214

Deine Antwort wird dir nicht gefallen, aber die beste Praxis ist, dies an einem anderen Ort als SQL zu tun. SQL ist dafür gedacht, Daten zu speichern, abzurufen und zu verarbeiten, nicht sie zu visualisieren. Nicht für die Anzeige zu formatieren. Meiner Meinung nach wäre es viel besser, eine Konsolenanwendung zu haben, die die Daten abruft und dann die Datei generiert.

Aber wenn ich das früher gemacht habe, habe ich es so gemacht:

declare @num int
set @num=1555
select replicate(' ',20-len(cast(@num as varchar))) + cast(@num as varchar)

Das Hartcodieren von Leerzeichen ist so schlimm, das wird wahrscheinlich bei einer großen Zahl brechen, aber dann wieder, wenn du eine feste Datei generierst, wirst du sowieso Müll für eine große Zahl generieren.

Bearbeiten

Ken, ich habe den Beitrag des OPs gelesen, und ja, er formatiert die Daten in eine Datei mit fester Breite. Der Punkt ist, dass du die Formatierung in einer Anwendungsschicht machen solltest, nicht in SQL. Ja, es schaut niemand visuell auf die Daten, aber ich denke, du formatierst immer noch die Daten, wir spalten wahrscheinlich Haare.

1voto

Daniel Pratt Punkte 11859

Das Einzige, was ich vorschlagen kann, um mit der "wahnsinnigen Komplexität" zu helfen, ist es, sie in eine oder mehrere Funktionen zu kapseln. Hier ist eine etwas modifizierte Version von etwas, das wir verwenden:

CREATE FUNCTION [dbo].[fn_PadRight]
(
    @Value nvarchar(4000)
    ,@NewLength int
    ,@PadChar nchar(1) = ' '
) RETURNS nvarchar(4000)
AS
BEGIN
    DECLARE @ValueLength int
    SET @ValueLength = LEN(@Value)

    IF (@NewLength > @ValueLength) BEGIN
        SET @Value = @Value + REPLICATE(@PadChar, @NewLength - @ValueLength)
    END

    RETURN @Value
END
GO

CREATE FUNCTION [dbo].[fn_FormatAmountDE]
(
    @Value money
) RETURNS nvarchar(4000)
AS
BEGIN
    RETURN [dbo].[fn_PadRight](REPLACE(CAST(@Value AS varchar), '.', ''), 12, '0')
END
GO

0voto

John Saunders Punkte 159011

Die beste Praxis im Allgemeinen wäre, dass die Datenbank Daten zurückgibt und die Präsentationsebene die Daten formatiert. Sie sollten keine Daten in der Datenbank formatieren.


Ich verstehe, worauf der Kommentar hinweist - Sie erstellen eine Extraktdatei. Ich frage mich immer noch, wie Sie die Daten aus dem SQL-Server und in die Datei bekommen. Sicher erstellt der SQL-Server die Festplatte nicht durch eine Abfrage?

Ich empfehle weiterhin, die Daten von der Präsentation zu trennen, auch wenn diese Präsentation eine Datei mit fester Länge ist. Dies ist etwas, das wir "in den guten alten Zeiten" gemacht haben, aber heute vermeiden sollten, jetzt wo wir Computer haben, die schnell genug sind, um mit Dingen wie der Trennung von Anliegen umzugehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X