您可以只使用内置的 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 中的函数没有真正的可选参数功能。