而不是創建一個新的函數,你可以使用內建的MAX聚合。
SELECT MAX(v) FROM (VALUES(A.SomeDateField),(B.SomeDateFiled),(C.SomeDateField),(D.SomeDateField))dates(v)
或在您的查詢的情況下:
SELECT *
FROM TableA AS A
JOIN TableB AS B
ON ...
JOIN TableC AS C
ON ...
JOIN TableD AS D
ON ...
WHERE (SELECT MAX(v) FROM (VALUES(A.SomeDateField),(B.SomeDateFiled),(C.SomeDateField),(D.SomeDateField))dates(v)) > '20130101 23:59:00'
如果這還不夠乾淨,你可以把它包裝成一個函數
CREATE FUNCTION dbo.CustomMaxDateFunction(@v1 DATETIME, @v2 DATETIME, @v3 DATETIME, @v4 DATETIME)
RETURNS TABLE
AS
RETURN SELECT MAX(v) MaxDate FROM (VALUES(@v1),(@v2),(@v3),(@v4))dates(v);
然後調用它像這樣:
SELECT *
FROM TableA AS A
JOIN TableB AS B
ON ...
JOIN TableC AS C
ON ...
JOIN TableD AS D
ON ...
CROSS APPLY dbo.CustomMaxDateFunction(A.SomeDateField, B.SomeDateFiled, C.SomeDateField, D.SomeDateField) AS mdf
WHERE mdf.MaxDate > '20130101 23:59:00'
遠離其他在此查詢上下文函數形式他們會傷害性能: http://sqlity.net/en/498/t-sql-tuesday-24-prox-n-funx/
所有功能的共同點但是,你固定的參數給定數量,所以第一個選項可能是你最好的選擇。
編輯: 如果你很喜歡一個函數的想法,你可以這樣做:
CREATE FUNCTION dbo.CustomMaxDateFunction(@v1 DATETIME, @v2 DATETIME, @v3 DATETIME, @v4 DATETIME)
RETURNS TABLE
AS
RETURN SELECT MAX(v) MaxDate FROM (VALUES(@v1),(@v2),(@v3),(@v4))dates(v) WHERE v IS NOT NULL;
現在你可以這樣調用:
SELECT *
FROM TableA AS A
JOIN TableB AS B
ON ...
CROSS APPLY dbo.CustomMaxDateFunction(A.SomeDateField, B.SomeDateFiled, NULL, NULL) AS mdf
WHERE mdf.MaxDate > '20130101 23:59:00'
實際上需要墊未使用帶NULL的參數。函數中額外的WHERE子句可防止有關消除NULL值的警告,否則您將獲得該值。正如RBarryYoung在評論中提到的那樣,SQL Server中的函數沒有真正的可選參數功能。
我知道它的一個示例查詢 - 但「在A.SomeField = B.SomeField」上連接TableD D是不正確的。 – Andrew
糟糕,你是對的。對不起,我正在複製和粘貼。我會解決這個問題。 – DavidStein