2009-03-17 7 views
4

Was ist die beste Methode für die Rechtfertigung einer numerischen in TSQL?Best Practice für die Rechtfertigung einer Numerisch in TSQL

Ich muss eine Extraktdatei mit fester Länge formatieren und muss die numerischen Felder rechts ausgerichtet haben. (Ich benutze SQL Server 2005)

Ich fand this, die ziemlich einfach scheint. Hier

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

ist die vollständige Select-Anweisung

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

Results: 

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

(3 row(s) affected) 

ich diese Frage bin zu fragen, weil ich diese Zeile Code bei der Arbeit gefunden, die GEISTESKRANK komplex erscheint (es ist auch das Dezimalsystem und Zerofilling entfernen)

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 benutzen, hat mich dazu gebracht, SQL# zu betrachten (was wir besitzen). Es hat eine Funktion namens PadLeft, die überraschenderweise die gleichen Parameter und Funktionen wie Daniel Pratts Funktion fn_PadRight hatte, die in seiner Antwort unten definiert wurde.

Hier ist, wie SQL # Funktion zu verwenden:

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 beide Zahlen und Strings nehmen.

+1

Gibt es einen Grund, Sie wollen dieses Recht Rechtfertigung in Ihrem Tsql Code zu tun und nicht im Bereich der Ausgabe (dh eine Website, Reporting Services, etc. .?) Versuchen, Layout in Tsql-Code selbst zu hämmern ist eine große WTF warten, um zu passieren, IMHO. – TheTXI

+0

@TheTXI: Lesen Sie mehr sorgfältig. Es gibt keinen "Ausgabebereich" außer einer Extraktdatei *. Wie führt eine Extraktdatei eine Formatierung der Daten durch? –

+0

Die ursprüngliche Frage hat gesagt, dass dies für eine "Extrakt" -Datei war. Daher klingt es nicht so, als würde er Daten und Präsentationen mischen. –

Antwort

1

Das einzige, was ich vorschlagen kann, um mit der "wahnsinnigen Komplexität" zu helfen, ist es 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 
0

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


Ich jetzt was der Kommentar darauf hinweist - Sie erstellen eine Extraktdatei. Ich frage mich immer noch, wie Sie die Daten aus SQL Server und in die Datei bekommen. Sicher erstellt SQL Server die Datenträger-Datei nicht durch eine Abfrage?

Ich empfehle immer noch die Daten aus der Präsentation zu trennen, auch wenn diese Präsentation eine Datei mit fester Länge ist. Das ist etwas, was wir früher "in den guten alten Zeiten" taten, aber wir sollten es heute vermeiden, da wir Computer haben, die schnell genug sind, um Dinge wie die Trennung von Sorgen zu erledigen.

+0

Danke für Ihre Antwort. Ich muss die Daten in der Datenbank formatieren. –

+1

Obwohl das mein erster Gedanke aus dem Post-Thema war, sagte er ausdrücklich, dass er eine * Extrahierdatei * mit fester Länge produzierte. –

1

Sie gehen nicht wie meine Antwort, aber die beste Praxis ist, dies irgendwo anders als SQL zu tun. SQL ist dafür gedacht, die Daten für den Abruf und die Verarbeitung zu speichern und nicht zu visualisieren. Nicht für die Anzeige formatieren. Sie wären viel besser IMHO mit einer Konsole-Anwendung, die die Daten zieht dann erzeugt die Datei.

Aber mit diesem wird gesagt, wenn ich das vorher getan hat, habe ich es wie folgt aus:

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

hartzucodieren Räume so böse, wird dies probally für eine große Zahl brechen, aber dann wieder, wenn Ihr eine feste Datei zu erzeugen Ihre gehen Müll erzeugen sowieso für eine große Anzahl

bearbeiten

Ken las ich habe die ops zu veröffentlichen, und ja, er ist eine Formatierung der Daten in eine feste Breite-Datei. Der Punkt ist, dass Sie die Formatierung in einer Anwendungsebene und nicht in SQL vornehmen sollten.Ja, es gibt niemanden, der die Daten visuell betrachtet, aber ich denke, ich fühle, dass Sie immer noch die Daten formatieren, wir spalten Haare.

+0

@Josh: Lesen Sie den Beitrag vor der Beantwortung. Es gibt hier keine "Visualisierung" oder Anzeige - das OP erstellt eine Extraktdatei *. Bitte erläutern Sie, wie eine Textdatei die Präsentation oder Formatierung von Daten durchführt. –

+0

Ich bezweifle, dass die Datei durch die Anwendung erstellt wird, die meisten dieser Dinge sind durch Jobs oder SSIS Pacakages oder dergleichen getan und nie in der Nähe der Anwendung. – HLGEM

Verwandte Themen