调用表值函数两次。可能一次?

时间:2014-04-15 13:03:33

标签: sql sql-server

我需要在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时,只能在选择列表中指定一个表达式。

这个查询可以改进,所以我只调用了一次这个函数吗?

2 个答案:

答案 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行,没问题,如果你返回数千个性能需要再次击中。

  • 完全展开函数并将其包含在查询中。最有可能是最快的,但缺点是不重复使用代码。