Kami memiliki tabel SQL lama yang digunakan oleh SQL Server 2000 selama hampir 10 tahun.
Di dalamnya, nomor lencana karyawan kami disimpan mulai char(6)
dari 000001
hingga 999999
.
Saya sedang menulis aplikasi web sekarang, dan saya perlu menyimpan nomor lencana karyawan.
Di tabel baru saya, saya dapat mengambil jalan pintas dan menyalin tabel lama, tetapi saya berharap transfer data yang lebih baik, ukuran yang lebih kecil, dll, hanya dengan menyimpan int
nilai from 1
to 999999
.
Di C #, saya dapat dengan cepat memformat int
nilai untuk nomor lencana menggunakan
public static string GetBadgeString(int badgeNum) {
return string.Format("{0:000000}", badgeNum);
// alternate
// return string.Format("{0:d6}", badgeNum);
}
Bagaimana cara mengubah kueri SQL sederhana ini untuk memformat nilai yang dikembalikan juga?
SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Jika EmployeeID
7135, kueri ini harus kembali 007135
.
sql
sql-server
tsql
string-formatting
jp2code
sumber
sumber
0
sangat penting untuk bidang ini, mengapa mengubahnyaINT
sama sekali?FORMAT
fungsi seperti C # :-)int
Nilai - nilai memakan ruang yang jauh lebih sedikitchar(6)
, dan akan ada beberapa entri ini per bagian yang diproduksi. Efisiensi.DATALENGTH()
) masing-masing dua byte. Karena kolom mungkin dalam indeks, Anda bisa menghemat lebih dari 2MB. Dan dengan kolom lain ditambahkan, 2 byte itu mungkin cukup untuk mengurangi panjang baris yang cukup untuk menyimpan halaman 4KB per baris. Apakah ini akan dihosting di platform seluler, atau mungkinkah Anda memfokuskan perhatian Anda di area yang tidak produktif?Jawaban:
Ubah angka 6 menjadi berapa pun panjang total Anda:
Jika kolomnya INT, Anda dapat menggunakan RTRIM untuk mengubahnya secara implisit menjadi VARCHAR
Dan kode untuk menghapus 0 ini dan mendapatkan kembali nomor 'asli':
sumber
Cukup gunakan fungsi FORMAT (berfungsi di SQL Server 2012 atau yang lebih baru):
Referensi: http://msdn.microsoft.com/en-us/library/hh213505.aspx
sumber
Format
tidak mempertahankan tipe data tetapi secara implisit mengonversi ke nvarchar:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
Anda dapat mengubah prosedur Anda dengan cara ini
Namun ini mengasumsikan bahwa Anda
EmployeeID
adalah nilai numerik dan kode ini mengubah hasilnya menjadi string, saya sarankan untuk menambahkan lagi nilai numerik asliEDIT Tentu saja saya belum membaca dengan seksama pertanyaan di atas. Dikatakan bahwa bidang tersebut adalah
char(6)
EmployeeID bukan nilai numerik. Meskipun jawaban ini masih memiliki nilai, itu bukanlah jawaban yang benar untuk pertanyaan di atas.sumber
'000000'
benar-benar perlu ..?'0'
juga bekerja dengan baik. Apakah aman menggunakan hanya satu 0 ..?07135
tidak akan menghasilkan hasil007135
. Seluruh ide adalah untuk menggabungkan ke string 6 karakter yang terdiri dari semua0
string yang dikonversi EmployeedID, kemudian MULAI dari tepi kanan ambil 6 karakter. Berapa pun panjang ID adalah metode di atas selalu mengembalikan string dengan hanya jumlah nol karakter yang diperlukan untuk mencapai panjang 6 karakter'00000'
karena suratEmployeeID
wasiat berisi setidaknya satu digit. TetapiREPLICATE()
fungsinya tampaknya lebih cocok, seperti di jawaban lainBenci harus MENGUBAH int, dan ini tampaknya jauh lebih sederhana. Bahkan dapat berkinerja lebih baik karena hanya ada satu konversi string dan penambahan sederhana.
pilih KANAN (1000000 + EmployeeId, 6) ...
Pastikan saja "1000000" memiliki setidaknya nol sebanyak ukuran yang dibutuhkan.
sumber
Saya memposting semua di satu tempat, semua bekerja untuk saya pad dengan 4 nol di depan :)
sumber
Cara lain, hanya untuk kelengkapan.
Atau, sesuai permintaan Anda
sumber
Mulai versi 2012 dan seterusnya, Anda dapat menggunakan
sumber
Sebersih mungkin dan berikan ruang lingkup penggantian dengan variabel:
sumber
EmployeeID
kolom didefinisikan sebagaiint
maka operator + akan diperlakukan sebagai penjumlahan daripada penggabungan sehingga angka nol akan hilang. Menggunakanconvert
akan menghindari masalah ini.sumber
sumber
7135.0
saat saya memberikannya7135
.Solusi ini berfungsi untuk bilangan bertanda / negatif dengan nol di depan, untuk semua versi Sql:
sumber
Yang paling sederhana selalu yang terbaik:
sumber
Dalam versi SQL saya, saya tidak dapat menggunakan REPLICATE. JADI saya melakukan ini:
sumber