บน SQL Server 2012 และใหม่กว่าคุณสามารถใช้TRY_CONVERTเพื่อตรวจสอบว่าสามารถแปลงอินพุตได้หรือไม่ หากไม่สามารถทำได้จะส่งคืนค่า NULL ดังนั้นคุณสามารถทำ COALESCE เพื่อรับค่าที่แปลงหรือวันที่กำหนด
begin
declare @result date
set @result = COALESCE(TRY_CONVERT(date, @date, 111), '2012-01-01')
return @result
end
คุณสามารถใช้TRY CATCH
บล็อกและส่งคืนวันที่คงที่ในCATCH
บล็อกได้ แต่ควรใช้ TRY_CONVERT เพื่อให้ SQL Server ไม่ต้องจัดการกับข้อผิดพลาดเนื่องจากต้องใช้เวลาและทรัพยากรมากขึ้น
ฟังก์ชั่นสำหรับรหัสประเภทนี้จะมีค่าใช้จ่ายมากกว่าการใช้ตรรกะเดียวกันในแบบสอบถามดังนั้นหากมีการเรียกหลายครั้งทุกวินาทีคุณอาจเคี้ยวทรัพยากรสำคัญโดยใช้ฟังก์ชั่น ฉันเข้าใจว่าอาจมีการเรียกใช้จากโค้ดหลาย ๆ ชิ้นดังนั้นจึงมีความต้องการที่จะทำให้มันเป็นฟังก์ชันในกรณีที่วันที่เริ่มต้นจำเป็นต้องเปลี่ยน - จากนั้นจะไม่มีการเปลี่ยนแปลงโค้ดที่คอมไพล์และเพียงแค่อัปเดตฟังก์ชั่นนี้
หากรหัสนี้จะถูกเรียกใช้จำนวนมากคุณควรพิจารณาตัวเลือกอื่น ๆ ที่จะให้ประสิทธิภาพที่ดีกว่าฟังก์ชั่นที่ผู้ใช้กำหนด โปรดดูคำตอบของโซโลมอนสำหรับภาพรวมของตัวเลือกของคุณและคำอธิบายเพิ่มเติมว่าทำไมคุณถึงเลือกตัวเลือกอื่น
ตัวอย่างเช่นต่อไปนี้แสดงตรรกะเดียวกับที่ใช้เป็นฟังก์ชั่นมูลค่าตารางแบบอินไลน์ซึ่งจำเป็นต้องใช้ด้วยCROSS APPLY
หากไม่ได้รับค่าคงที่ แต่ทำงานได้ดีกว่าสเกลาร์ UDF:
USE [tempdb];
GO
CREATE
OR ALTER -- comment out if using pre-SQL Server 2016 SP1
FUNCTION dbo.ReturnDate (@Date VARCHAR(8))
RETURNS TABLE
AS RETURN
SELECT ISNULL(TRY_CONVERT(DATE, @Date, 111), '2020-01-01') AS [TheDate];
GO
SELECT *
FROM (VALUES (1, '20120101'), (2, '2012ABCD')) tab(ID, Input)
CROSS APPLY dbo.ReturnDate(tab.[Input]) dt
/*
ID Input TheDate
1 20120101 2012-01-01
2 2012ABCD 2020-01-01
*/