【发布时间】:2020-10-08 16:39:25
【问题描述】:
我有一个内联函数,导致在 T-SQL 脚本执行期间我需要多次。该函数的结果非常大。我想弄清楚如何只调用一次函数。
这是我的功能:
CREATE OR ALTER FUNCTION getRecords (@earliestDate Datetime, @token1 varchar(64), @token2 varchar(64))
RETURNS TABLE
AS
RETURN
(
SELECT CONVERT(DATE, LogDate) AS LogDate, UserType, UserStatus
FROM LogTable WITH (NOLOCK)
WHERE UserStatus = 'Active'
AND LogDate >= @earliestDate
AND (token = @token1 OR token = @token2)
GROUP BY LogDate, UserType, UserStatus
);
GO
我需要稍后在脚本的不同位置使用结果。例如:
DECLARE @token1 varchar(64) = '1111'
DECLARE @token2 varchar(64) = '9999'
DECLARE @earliestDate Datetime='2020-09-01';
SELECT Product, UserType,
(SELECT COUNT(DISTINCT UserStatus)
FROM getRecords (@earliestDate, @token1, @token2) AS GR
INNER JOIN mySecondTable AS ST
ON GR.UserType = ST.UserType
) AS MyCount
FROM ProductTypes INNER JOIN getRecords (@earliestDate, @token1, @token2) AS GR2
ON ProductTypes.UserType = GR2.UserType;
WHERE ProductTypes.avail = 1;
这是一个很长的脚本。我需要在不同的步骤中使用结果。我尝试创建一个临时表,但过程太慢了。
上述查询有效,但我想让它更有效率。
一如既往,感谢您的任何建议。
【问题讨论】:
-
停止喷溅nolock everywhere。除非您了解后果、有使用它的正当理由并接受可能引发的错误,否则请勿使用该提示。
-
由于每次调用函数时使用的参数都完全相同,我建议您使用临时表而不是函数。
-
谢谢@SMor,我不知道 NOLOCK。我会调查的。
-
嗨@JMabee,我想这就是我最终要做的。我以前试过,但花了很长时间。我会调查的。
标签: sql sql-server tsql inline-functions