UDF 內不允許呼叫非確定性函數 (GETDATE(), NEWID(), RAND() 等),因其每次呼叫結果不同,會造成副作用,破壞函數確定性。
-- 1. 建立回傳目前時間的檢視表
CREATE VIEW v_getdate AS SELECT GETDATE() AS [output];
GO
-- 2. 在 UDF 中查詢該檢視表
CREATE FUNCTION f_getdate() RETURNS DATETIME AS BEGIN
DECLARE @n DATETIME;
SELECT @n = [output] FROM v_getdate;
RETURN @n;
END;
GO
-- 3. 呼叫
SELECT dbo.f_getdate();
檢視表展開時才執行 GETDATE(),UDF 本身只查詢檢視表,符合確定性規則 (同一陳述式內多次呼叫仍回傳同一值)。
f_getdate() 會回傳相同值 (陳述式開始時刻)。GETDATE(),無需 UDF 包裝。@@CONNECTIONS @@TOTAL_ERRORS @@CPU_BUSY @@TOTAL_READ @@IDLE @@TOTAL_WRITE
@@IO_BUSY GETDATE @@MAX_CONNECTIONS GETUTCDATE @@PACK_RECEIVED NEWID
@@PACK_SENT RAND @@PACKET_ERRORS TEXTPTR @@TIMETICKS