Wir haben eine alte SQL-Tabelle, die fast 10 Jahre lang von SQL Server 2000 verwendet wurde.
Darin werden unsere Mitarbeiterausweisnummern char(6)
von 000001
bis gespeichert 999999
.
Ich schreibe gerade eine Webanwendung und muss die Ausweisnummern der Mitarbeiter speichern.
In meiner neuen Tabelle könnte ich die Verknüpfung nehmen und die alte Tabelle kopieren, aber ich hoffe auf eine bessere Datenübertragung, kleinere Größe usw., indem ich einfach die int
Werte von 1
bis speichere 999999
.
In C # kann ich mit schnell einen int
Wert für die Ausweisnummer formatieren
public static string GetBadgeString(int badgeNum) {
return string.Format("{0:000000}", badgeNum);
// alternate
// return string.Format("{0:d6}", badgeNum);
}
Wie würde ich diese einfache SQL-Abfrage ändern, um auch den zurückgegebenen Wert zu formatieren?
SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Wenn EmployeeID
7135 ist, sollte diese Abfrage zurückgegeben werden 007135
.
sql
sql-server
tsql
string-formatting
jp2code
quelle
quelle
0
s für dieses Gebiet von Bedeutung sind, warum sollte man sie überhaupt in ein ändernINT
?FORMAT
Funktion wie C # haben :-)int
Werte nehmen deutlich weniger Platz einchar(6)
, und es werden mehrere dieser Einträge pro Teil hergestellt, das hergestellt wird. Effizienz.DATALENGTH()
) jeweils zwei Bytes speichern können. Da sich die Spalte möglicherweise in einem Index befindet, können Sie mehr als 2 MB speichern. Und wenn andere Spalten addiert werden, reichen diese 2 Bytes möglicherweise gerade aus, um die Länge einer Zeile so weit zu reduzieren, dass eine 4-KB-Seite pro Zeile gespeichert wird. Wird dies auf einer mobilen Plattform gehostet oder konzentrieren Sie Ihre Aufmerksamkeit möglicherweise auf einen unproduktiven Bereich?Antworten:
Ändern Sie die Zahl 6 in die Gesamtlänge, die Sie benötigen:
Wenn die Spalte eine INT ist, können Sie sie mit RTRIM implizit in eine VARCHAR konvertieren
Und der Code, um diese Nullen zu entfernen und die 'echte' Zahl zurückzugewinnen:
quelle
Verwenden Sie einfach die FORMAT-Funktion (funktioniert unter SQL Server 2012 oder neuer):
Referenz: http://msdn.microsoft.com/en-us/library/hh213505.aspx
quelle
Format
behält den Datentyp nicht bei, konvertiert aber implizit in nvarchar:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
Sie können Ihr Verfahren auf diese Weise ändern
Dies setzt jedoch voraus, dass Ihr
EmployeeID
Wert ein numerischer Wert ist und dieser Code das Ergebnis in eine Zeichenfolge ändert. Ich empfehle, den ursprünglichen numerischen Wert erneut hinzuzufügenBEARBEITEN Natürlich habe ich die obige Frage nicht sorgfältig gelesen. Es heißt, dass das Feld eine
char(6)
so ist, dass EmployeeID kein numerischer Wert ist. Obwohl diese Antwort per se immer noch einen Wert hat, ist sie nicht die richtige Antwort auf die obige Frage.quelle
'000000'
wirklich notwendig ..?'0'
funktioniert auch gut. Ist es sicher, nur eine 0 zu verwenden?07135
nicht zurück007135
. Die ganze Idee besteht darin, eine Zeichenfolge0
mit 6 Zeichen zu verketten, die aus der gesamten konvertierten EmployeedID besteht, und dann ab dem rechten Rand 6 Zeichen zu verwenden. Unabhängig von der Länge der ID gibt die oben beschriebene Methode immer eine Zeichenfolge mit nur der Anzahl von Null Zeichen zurück, die erforderlich ist, um die Länge von 6 Zeichen zu erreichen'00000'
da dieEmployeeID
mindestens eine Ziffer enthalten. Aber dieREPLICATE()
Funktion scheint passender zu sein, wie in den anderen AntwortenIch hasste es, das Int konvertieren zu müssen, und das scheint viel einfacher zu sein. Könnte sogar eine bessere Leistung erzielen, da es nur eine Zeichenfolgenkonvertierung und eine einfache Addition gibt.
Wählen Sie RECHTS (1000000 + EmployeeId, 6) ...
Stellen Sie einfach sicher, dass der "1000000" mindestens so viele Nullen wie die benötigte Größe hat.
quelle
Ich poste alles an einem Ort, alles funktioniert für mich, um mit 4 führenden Nullen aufzufüllen :)
quelle
Ein anderer Weg, nur der Vollständigkeit halber.
Oder gemäß Ihrer Anfrage
quelle
Ab Version 2012 können Sie verwenden
quelle
So sauber wie es nur geht und den Umfang des Ersetzens durch Variablen bietet:
quelle
EmployeeID
Spalte als definiertint
ist, wird der Operator + eher als Addition als als Verkettung behandelt, sodass die Nullen verloren gehen. Durchconvert
die Verwendung wird dieses Problem vermieden.quelle
quelle
7135.0
als ich es gab7135
.Die Lösung funktioniert für vorzeichenbehaftete / negative Zahlen mit führenden Nullen für alle SQL-Versionen:
quelle
Das Einfachste ist immer das Beste:
quelle
In meiner SQL-Version kann ich REPLICATE nicht verwenden. Also habe ich das gemacht:
quelle