【发布时间】:2015-11-04 21:10:37
【问题描述】:
在 SQL Server 2008 R2 中,在一个存储过程中我有 2 个DECLARE 和一个脚本中的递归 CTE:
DECLARE @MaxActivityDate DATETIME = (SELECT MAX(ActivityDate) FROM tbl)
DECLARE @MinActivityDate DATETIME = (SELECT MIN(ActivityDate) FROM tbl)
-- Generate all the dates between the minimum and the maximum
WITH DateRange (DateValue) AS
(
SELECT @MinActivityDate DateValue
UNION ALL
SELECT DateValue + 1
FROM DateRange
WHERE DateValue + 1 <= @MaxActivityDate
)
SELECT DateValue
FROM DateRange
[...]
我现在需要在另一个存储过程中使用此代码。我不想要任何代码重复。如何将其转换为要在两个脚本中使用的函数?
【问题讨论】:
-
在把它变成一个函数时要小心——它“隐藏”了这个函数中有一个数据库访问的事实,并在一个更大的
SELECT中重复调用这个代码(返回大量行)可能会导致非常糟糕的性能。 -
我从问题中隐藏了一些代码(为了简化问题),这些代码调整了 MIN、MAX 数字,使它们永远不会相隔 1 年。
标签: sql-server tsql recursion sql-server-2008-r2 sql-function