我需要在SQL中使用一个返回表
的函数此刻我有:
SELECT
K.ID,
(SELECT A from dbo.TableFunction1 (K.ID,0,77)) AS A,
(SELECT B from dbo.TableFunction1 (K.ID,0,77)) AS B
FROM K
我很担心,因为我使用相同的参数执行相同的函数两次,一次获得一列,下一次获得另一列。
事实证明我做不到:
SELECT
K.ID,
(SELECT A,B from dbo.TableFunction1 (K.ID,0,77))
FROM K
我得到:当子查询未引入EXISTS时,只能在选择列表中指定一个表达式。
这个查询可以改进,所以我只调用了一次这个函数吗?
答案 0 :(得分:3)
尝试使用cross apply
:
select K.ID, tf1.A, tf1.B
from K cross apply
dbo.TableFunction1(K.ID, 0, 77) tf1
答案 1 :(得分:0)
你可以在这里做三件事:
使用交叉申请
select k.id, f.b, f.b
from k
cross apply dbo.TableFunction(k.id, 0, 77)
如果您的查询保持这么简单,这将正常工作,但如果您开始有其他连接,这限制了您将从“K”返回的行数,那么您仍然可以在每个连接上运行“TableFunction”在“K”中排。我已经看到这变成了一场表演噩梦。
将函数转换为2个标量函数
select
K.ID,
dbo.ScalarFunctionA (K.ID,0,77)) AS A,
dbo.ScalarFunctionB (K.ID,0,77)) AS B
FROM K
如果您在该函数中有一个大查询,那么这也存在缺陷,您现在为返回的每一行运行该查询两次。如果你只返回1行,没问题,如果你返回数千个性能需要再次击中。