( Jika Anda menggunakan SQL Server 2012 atau yang lebih baru, silakan lihat jawaban @ wBob untuk pendekatan yang lebih bersih. Pendekatan yang dijabarkan dalam jawaban saya di bawah ini hanya diperlukan jika Anda menggunakan SQL Server 2008 R2 atau lebih lama. )
Anda tidak perlu (atau ingin) pemisah ribuan saat mengkonversi NUMERIC
, terlepas dari apakah itu koma, titik, atau ruang, jadi singkirkan saja dulu. Kemudian konversikan koma menjadi titik / desimal dan Anda selesai:
SELECT CONVERT(NUMERIC(10, 2),
REPLACE(
REPLACE('7.000,45', '.', ''),
',', '.'
)
) AS [Converted];
Pengembalian:
7000.45
Demi kelengkapan, saya harus menyebutkan bahwa saya juga mencoba:
SET LANGUAGE Greek;
Melihat berbagai gaya format untuk CONVERT , tetapi tidak ada yang berlaku di sini.
Fungsi FORMAT , tetapi tipe input harus berupa nilai numerik atau tanggal / waktu / waktu (itu dan itu diperkenalkan di SQL Server 2012, jadi tidak berlaku untuk SQL Server 2008 R2 atau lebih lama).
Dan sepertinya tidak ada yang berhasil. Saya berharap untuk menemukan sesuatu yang lebih elegan daripada dua REPLACE
panggilan, tetapi sejauh ini tidak ada keberuntungan.
Juga, hanya untuk menyebutkan, meskipun bukan solusi T-SQL murni, ini juga dapat dicapai melalui SQLCLR. Dan, ada fungsi pra-selesai yang melakukan ini di perpustakaan SQL # (yang saya tulis) bernama String_TryParseToDecimal . Fungsi ini tersedia dalam versi Gratis, dan berfungsi di setiap versi SQL Server dimulai dengan SQL Server 2005:
SELECT SQL#.String_TryParseToDecimal('7.000,45', 'el-GR');
Pengembalian:
7000.45000000000000000000
Kode berikut berfungsi dalam kasus saya:
output: 123.456.789,03
sumber
VARCHAR
,NVARCHAR
,CHAR
, danNCHAR
jenis. Standarnya adalah 30 dalam beberapa kasus dan 1 dalam kasus lain, yang membuat kode yang tidak dapat dipelihara / rawan kesalahan. 2) Anda tidak perlu tata letak yang tepat saat menggunakan#
. Anda hanya perlu satu dari mereka (mis.#
) Untuk semua digit tetapi tidak ada pemisah ribuan, atau dua dari mereka dipisahkan oleh koma (mis.#,#
) Untuk mendapatkan semua digit dan pemisah ribuan. Karenanya,SELECT CONVERT(VARCHAR(20), FORMAT(123456789.0258, N'#,#.00', N'de'));
kembalikan output yang sama dengan yang Anda sarankan.