首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

在使用者定義函數中使用 GETDATE() 的替代方案

     編輯:關於SqlServer

限制原因

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() 會回傳相同值 (陳述式開始時刻)。
  • 跨陳述式則會取得新時間。
  • SQL Server 2005+ 可直接在預設約束、計算欄位使用 GETDATE(),無需 UDF 包裝。
  • 嚴禁在 UDF 中呼叫擴充預存程序或修改資料,否則會導致不可預期的副作用。

非確定性函數清單 (不可直接用於 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved