Mamy starą tabelę SQL, która była używana przez SQL Server 2000 przez blisko 10 lat.
W nim przechowywane są numery naszych identyfikatorów pracowników char(6)
od 000001
do 999999
.
Piszę teraz aplikację internetową i muszę przechowywać numery identyfikatorów pracowników.
W mojej nowej tabeli mógłbym skorzystać ze skrótu i skopiować starą tabelę, ale mam nadzieję na lepszy transfer danych, mniejszy rozmiar itp., Po prostu przechowując int
wartości od 1
do 999999
.
W C # mogę szybko sformatować int
wartość numeru odznaki przy użyciu
public static string GetBadgeString(int badgeNum) {
return string.Format("{0:000000}", badgeNum);
// alternate
// return string.Format("{0:d6}", badgeNum);
}
Jak zmodyfikować to proste zapytanie SQL, aby również sformatować zwracaną wartość?
SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Jeśli EmployeeID
wynosi 7135, to zapytanie powinno zwrócić 007135
.
sql
sql-server
tsql
string-formatting
jp2code
źródło
źródło
0
s są znaczące w tej dziedzinie, po coINT
w ogóle zmieniać ją na?FORMAT
funkcję taką jak C # :-)int
Wartości zajmują znacznie mniej miejsca niż techar(6)
i będzie ich wiele na wyprodukowaną część. Wydajność.DATALENGTH()
) dwa bajty każdy. Ponieważ kolumna może znajdować się w indeksie, możesz zaoszczędzić więcej niż 2 MB. Po dodaniu innych kolumn te 2 bajty mogą wystarczyć, aby zmniejszyć długość wiersza na tyle, aby zapisać stronę 4KB na wiersz. Czy to będzie hostowane na platformie mobilnej, czy może skupiasz się na nieproduktywnym obszarze?Odpowiedzi:
Zmień liczbę 6 na dowolną wymaganą całkowitą długość:
Jeśli kolumna to INT, możesz użyć RTRIM, aby niejawnie przekonwertować ją na VARCHAR
I kod do usunięcia tych zer i odzyskania „prawdziwej” liczby:
źródło
Po prostu użyj funkcji FORMAT (działa na SQL Server 2012 lub nowszym):
Źródła: http://msdn.microsoft.com/en-us/library/hh213505.aspx
źródło
Format
nie zachowuje typu danych, ale niejawnie konwertuje do nvarchar:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
W ten sposób możesz zmienić swoją procedurę
Jednak zakłada się, że twoja
EmployeeID
jest wartością liczbową i ten kod zmienia wynik na ciąg, sugeruję ponowne dodanie oryginalnej wartości liczbowejEDYCJA Oczywiście nie przeczytałem dokładnie powyższego pytania. Mówi, że pole jest
char(6)
więc EmployeeID nie jest wartością liczbową. Chociaż ta odpowiedź ma wartość samą w sobie, nie jest to poprawna odpowiedź na powyższe pytanie.źródło
'000000'
naprawdę konieczne…?'0'
również działa dobrze. Czy bezpiecznie jest używać tylko jednego 0 ..?07135
nie zwraca007135
. Cały pomysł polega na konkatenacji do ciągu 6-znakowego złożonego z całego0
łańcucha przekształconego EmployeedID, a następnie POCZĄTKUJĄC od prawej krawędzi weź 6 znaków. Niezależnie od długości ID, powyższa metoda zwraca zawsze ciąg zawierający tylko liczbę znaków zerowych wymaganą do osiągnięcia długości 6 znaków'00000'
ponieważEmployeeID
będzie zawierał co najmniej jedną cyfrę. AleREPLICATE()
funkcja wydaje się bardziej dopasowana, podobnie jak w innych odpowiedziachNienawidziłem konieczności KONWERSJI int, a to wydaje się znacznie prostsze. Może nawet działać lepiej, ponieważ istnieje tylko jedna konwersja ciągów i proste dodawanie.
wybierz PRAWO (1000000 + EmployeeId, 6) ...
Tylko upewnij się, że wartość „1000000” ma co najmniej tyle zer, ile potrzeba.
źródło
Piszę wszystko w jednym miejscu, wszystko działa u mnie dopinanie z 4 wiodącymi zerami :)
źródło
Inny sposób, tylko dla kompletności.
Lub, zgodnie z zapytaniem
źródło
Od wersji 2012 i nowszych można używać
źródło
Tak czysty, jak to tylko możliwe i daje możliwość zamiany na zmienne:
źródło
EmployeeID
kolumna jest zdefiniowana jako,int
to operator + będzie traktowany jako dodawanie, a nie konkatenacja, a więc zera zostaną utracone. Użycieconvert
pozwoli uniknąć tego problemu.źródło
źródło
7135.0
kiedy to dałem7135
.Rozwiązanie działa dla liczb ze znakiem / ujemnymi z wiodącymi zerami, dla wszystkich wersji Sql:
źródło
Najprostsze jest zawsze najlepsze:
źródło
W mojej wersji SQL nie mogę użyć REPLICATE. Więc zrobiłem to:
źródło