SQL Select table 值函数的字段
SQL Select fields of table value function
我声明了一个 table 赋值函数,这样我就可以一次性 return 多个值。这些值是使用 DECLARE 以及 Maths 和 Date 函数计算的。
该功能的结构使得它只需要 'logged date' 和支持系统中问题的优先级。老实说,我认为我可以 select 如下:
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
我看不到 Apply 的可能加入(反正我也不完全理解)。
有谁知道相同参数的函数调用是否会执行一次?如果我不打算在查询运行时以大量子查询和函数调用结束,那么我不在乎,即使不简洁,代码实际上也很整洁。
如果开销很大,有人知道如何从 table 这种 table 函数中 select 所有列吗(即没有键,只是对相同输入数据进行多次计算)。
谢谢。
马克
不要那样做!内联查询永远不会比 JOINS 或 APPLY 快。重写您的查询并检查 IO。您可以将其重写为:
SELECT SupportCall.*,
SLADays = gs.SLADays,
SLAReceived = gs.SLAReceived,
...
From SupportCall sc
CROSS APPLY dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority) gs
你就不能这样做吗:
SELECT C.*,
F.SLADays,
F.SLAReceived,
F.SLATarget,
F.SLAHoursRemaining
From
SupportCall C
cross apply dbo.GetSLAStatus(C.createDate, C.priority) F
我希望你的函数是一个内联函数(例如有一个以 returns table return (...) 开头的语句并且没有定义结果 table)
我声明了一个 table 赋值函数,这样我就可以一次性 return 多个值。这些值是使用 DECLARE 以及 Maths 和 Date 函数计算的。
该功能的结构使得它只需要 'logged date' 和支持系统中问题的优先级。老实说,我认为我可以 select 如下:
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
我看不到 Apply 的可能加入(反正我也不完全理解)。
有谁知道相同参数的函数调用是否会执行一次?如果我不打算在查询运行时以大量子查询和函数调用结束,那么我不在乎,即使不简洁,代码实际上也很整洁。
如果开销很大,有人知道如何从 table 这种 table 函数中 select 所有列吗(即没有键,只是对相同输入数据进行多次计算)。
谢谢。
马克
不要那样做!内联查询永远不会比 JOINS 或 APPLY 快。重写您的查询并检查 IO。您可以将其重写为:
SELECT SupportCall.*,
SLADays = gs.SLADays,
SLAReceived = gs.SLAReceived,
...
From SupportCall sc
CROSS APPLY dbo.GetSLAStatus(SupportCall.createDate, SupportCall.priority) gs
你就不能这样做吗:
SELECT C.*,
F.SLADays,
F.SLAReceived,
F.SLATarget,
F.SLAHoursRemaining
From
SupportCall C
cross apply dbo.GetSLAStatus(C.createDate, C.priority) F
我希望你的函数是一个内联函数(例如有一个以 returns table return (...) 开头的语句并且没有定义结果 table)