我声明了一个表值函数,这样我就可以一次返回多个值。使用DECLARE和Maths and Date函数计算值。
该功能的结构使得它只需要“记录日期”,并且是支持系统中问题的优先级。老实说,我认为我可以选择如下:
SELECT SupportCall.*, dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority).* FROM SupportCall
我实际上最终得到了:
SELECT SupportCall.*,
SLADays = (select SLADays from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority)),
SLARecieved = (select SLAReceived from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority)),
SLATarget = (select SLATarget from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority)),
SLAHoursRemaining = (select SLAHoursRemaining from dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority))
From SupportCall
我看不到申请的可能加入(我还不完全理解)。
有人知道具有相同参数的函数调用是否会被执行一次?如果在查询运行时我不会最终得到大量子查询和函数调用,那么我不在乎,如果不简洁,代码实际上非常整洁。
如果存在大量开销,是否有人知道如何从这种表函数中选择所有列(即没有键,只对相同输入数据进行多次计算)。
感谢。
标记
答案 0 :(得分:2)
不要这样做!内联查询永远不会比JOINS或APPLY快。重写您的查询并检查IO。您可以将其重写为:
SELECT SupportCall.*,
SLADays = gs.SLADays,
SLAReceived = gs.SLAReceived,
...
From SupportCall sc
CROSS APPLY dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority) gs
答案 1 :(得分:0)
你不能这样做:
SELECT C.*,
F.SLADays,
F.SLAReceived,
F.SLATarget,
F.SLAHoursRemaining
From
SupportCall C
cross apply dbo.GetSLAStatus(C.createDate, C.priority) F
我希望你的函数是一个内联函数(例如,有一个语句开始返回表返回(...)并且没有定义的结果表)