Saya perlu menulis fungsi untuk menerima karakter string dan mengembalikan format tanggal. Misalnya inputnya adalah 20120101 dan saya perlu 2012-01-01 ini. Masalahnya adalah bahwa mungkin ada beberapa input yang salah seperti "2012ABCD" ini. Dalam hal ini, saya ingin fungsi mengembalikan tanggal tetap seperti 2020-01-01. Apa yang saya tulis sejauh ini adalah:
Create Function ReturnDate
(@date varchar(8))
Returns date
as
begin
declare @result date
set @result = (select convert(date , @date,111))
if(@@ROWCOUNT>0) return @result
else return '2020-01-01'
return @result
end
Ini tidak berfungsi dan saya tidak tahu bagaimana menangani bagian kedua (ketika input salah).
sql-server
t-sql
functions
Pantea Tourang
sumber
sumber
yyyymmdd
format?Jawaban:
Pada SQL Server 2012 dan yang lebih baru Anda dapat menggunakan TRY_CONVERT untuk memeriksa untuk melihat apakah input dapat dikonversi. Jika tidak, nilai NULL dikembalikan sehingga Anda dapat melakukan COALESCE untuk mendapatkan nilai yang dikonversi atau tanggal tetap.
Anda juga bisa menggunakan
TRY CATCH
blok dan mengembalikan tanggal tetap diCATCH
blok, tetapi praktik terbaik untuk menggunakan TRY_CONVERT sehingga SQL Server tidak harus menangani kesalahan karena membutuhkan lebih banyak waktu dan sumber daya.Suatu fungsi untuk jenis kode ini akan menimbulkan lebih banyak overhead daripada hanya menggunakan logika yang sama dalam kueri, jadi jika itu dipanggil berkali-kali setiap detik Anda mungkin mengunyah sumber daya yang signifikan dengan menggunakan fungsi untuknya. Saya mengerti bahwa ini dapat dipanggil dari berbagai bagian kode sehingga ada keinginan untuk menjadikannya fungsi jika tanggal default perlu diubah - maka tidak ada perubahan kode yang dikompilasi dan perbarui saja fungsi ini.
Jika kode ini akan banyak berjalan, Anda harus mempertimbangkan opsi lain yang akan memberikan kinerja yang lebih baik daripada fungsi yang ditentukan pengguna. Silakan lihat jawaban Solomon untuk ikhtisar opsi Anda dan penjelasan lebih lanjut mengapa Anda memilih satu di atas yang lain.
Sebagai contoh, berikut ini menunjukkan logika yang sama diimplementasikan sebagai fungsi bernilai tabel inline, yang perlu digunakan
CROSS APPLY
jika tidak disertakan dengan nilai statis, tetapi berkinerja jauh lebih baik daripada skalar UDF:sumber
FINALLY
blok di T-SQL (saya pikir Anda maksudCATCH
). 2) Anda mungkin harus menyebutkan bahwaTRY_CONVERT
dimulai pada 2012 (beberapa orang terjebak pra-SQL Server 2012). 3) sudahkah Anda dianggap sebagai TVF sebaris? Mereka tidak memiliki masalah kinerja yang sama dengan UDF Skalar.