2016-10-03 5 views
0

Das System mit denen ich arbeite hat ein Nummerierungssystem, wo die Zahlen 0-999 durch die üblichen 0-999 vertreten sind, aber 1000 durch vertreten, gefolgt von A01, A02, A03, etc, 1100 seinen B00 usw.Benutzerdefinierte Zahlenfolge Formatierung

Ich kann mir keinen Weg vorstellen, wie ich das in T-SQL handhaben kann, ohne einzelne Ziffern mit großen Fallanweisungen zu untersuchen, und es muss einen besseren Weg geben. Ich hatte über Hexadezimal gedacht, aber das ist nicht richtig.

DECLARE @startint int = 1, 
     @endint int = 9999; 

;WITH numbers(num) 
AS 
(
    SELECT @startint AS num 
    UNION ALL SELECT num+1 FROM numbers 
    WHERE num+1 <= @endint 
) 
SELECT num, convert(varbinary(8), num) FROM [numbers] N 
OPTION(MAXRECURSION 0) 

Mit diesem 999 ist jetzt 3E7, wo es nur 999 sein sollte.

Diese produziert derzeit folgendermaßen aus:

Number Sequence 
0   0x00000000 
1   0x00000001 
... 
10  0x0000000A 
... 
100  0x00000064 
... 
999  0x000003E7 
1000  0x000003E8 

Was ich suche:

Number Sequence 
0   000 
1   001 
... 
10  010 
11  011 
12  012 
... 
999  999 
1000  A00 
1001  A01 
... 
1099  A99 
1100  B00 
1101  B01 
1200  C00 

Ich brauche das 2008

+0

Können Sie bitte Ihre erwartete Ausgabe und aktuellen Daten – TheGameiswar

+0

SQL Server zeigen bereits [Sequenzen] (https://msdn.microsoft.com/en-us/library/ff878058.aspx). Diese rekursive Version ist tatsächlich eine der langsamsten Möglichkeiten zum Generieren einer Nummerntabelle und nicht zum Generieren der nächsten Nummer in einer Sequenz. Schließlich ist Ihr Problem nicht einer der Rollover (Sie rollen überhaupt nicht), es ist eine Frage der Formatierung einer Zahl zu einer Zeichenfolge –

+0

@ PanagiotisKanavos nicht besorgt darüber, wie schnell oder langsam es ist. Das System wurde geschrieben, als die Leute neu zu programmieren waren, also gibt es tatsächlich einen Tisch, in dem all das gespeichert wird ... * cringe * ... aber das bedeutet, dass ich es einfügen und mich nie wieder darum kümmern muss. – Logan

Antwort

0

in SQL Server arbeiten Sie Integer-Division verwenden können, und modulo, um den Hunderter Teil von den Zehner zu trennen. Danach können Sie dem Quotienten 64 hinzufügen, um einen ASCII-Wert ab A zu erhalten.

create function function dbo.fn_NumToThreeLetters(@num integer) 
RETURNS nchar(3) 
AS 
begin 
RETURN (SELECT (case 
        when @num/1000 >0 then 
         CHAR(((@num-900)/100) +64) 
         + replace(cast(@num %100 as nchar(2)),' ','0') 
        else cast(@num as nvarchar(3)) 
       end) 
     ) 
END 

select dbo.fn_NumToThreeLetters(1100) 
------- 
B00 

select dbo.fn_NumToThreeLetters(999) 
------- 
999 

Die erste when Klausel stellt sicher, dass die Umwandlung nur dann angewandt wird, wenn eine Zahl über 1000 ist Wenn es ist, subtrahieren 900 dann durch 100 teilen, so erhalten wir eine Zahl, die für 1000 von 1 beginnt, 2 für 1100, usw.

Fügen Sie 64 hinzu, um ein ASCII beginnend von A zu erhalten und es zurück in ein Zeichen mit CHAR zu konvertieren.

Der Rest muss nur in ein zweistelliges nchar konvertiert werden, wobei Leerzeichen durch 0 ersetzt werden.

Dies funktioniert nur bis zu 3500. Die Frage ist nicht festgelegt, was mit einer größeren Anzahl

getan werden sollte
+0

Spec spezifiziert nur Werte bis 'Y99', also funktioniert das perfekt, danke. – Logan

Verwandte Themen