将表值函数连接到MSSQL查询

时间:2009-03-30 22:37:57

标签: sql-server

我有一个表值函数,它接受一个人的ID号并返回几行和一列。在另一个查询中,我正在创建一个SELECT,它可以检索有关很多人的大量信息。如何将我的主查询中的id号传递给我的函数来汇总列并将其加入我的主查询?我希望我没有表值函数,因为它可以很容易地工作,但是,这个函数在别处使用,我想重用它。也许这对于表值函数甚至不可能,我需要创建一个标量值。

我的主要查询如下:

select id_num, name, balance 
from listOfPeople

表值函数如下所示:

calculatePersonalDiscount(id_number)

我想做点什么:

select id_num, name, balance 
from listOfPeople
left join 
(
  SELECT id_num, SUM(discount)
  FROM calculatePersonalDiscount(listOfPeople.id_num)
) x ON x.id_num = listOfPeople.id_num

但是你不能将listOfPeople.id_num传递给函数,因为它的范围并不相同。

3 个答案:

答案 0 :(得分:43)

在SQL Server 2005中,您可以使用CROSS APPLY syntax

select id_num, name, balance, SUM(x.discount)
from listOfPeople
    cross apply dbo.calculatePersonalDiscount(listOfPeople.id_num) x

同样,还有一个OUTER APPLY语法,相当于LEFT OUTER join。

答案 1 :(得分:0)

我非常需要此功能,而您给了我一个开始,在这里,我可以加入另一个View。 (另一个表也可以),并且我在WHERE子句中包含了另一个函数。

SELECT CL_ID, CL_LastName, x.USE_Inits 
FROM [dbo].[tblClient]
JOIN dbo.vw_InsuranceAppAndProviders ON dbo.vw_InsuranceAppAndProviders.IAS_CL_ID = tblClient.CL_ID
CROSS APPLY dbo.ufx_HELPER_Client_CaseWorker(tblClient.CL_ID) x
WHERE dbo.vw_InsuranceAppAndProviders.IAS_CL_ID = tblClient.CL_ID
AND dbo.ufx_Client_IsActive_By_CLID(tblClient.CL_ID) = 1
AND  (dbo.vw_InsuranceAppAndProviders.IAS_InsuranceType = 'Medicare')

答案 2 :(得分:0)

我找不到任何证明,但是似乎您可以正常加入函数,就像使用表或视图那样。我在SQL Server 2017上尝试过它,但不知道还有哪些其他版本支持它:

CREATE FUNCTION dbo.test_join_func
(
    @param INT
)
RETURNS TABLE
AS
    RETURN (
               SELECT * FROM sys.tables);
GO

CREATE TABLE dbo.test_join_tbl
(
    a INT
);
GO

INSERT INTO dbo.test_join_tbl (a) VALUES (1);
GO

SELECT *
  FROM dbo.test_join_tbl       AS tjt
-- using any join condition just to test it is working
  JOIN dbo.test_join_func(123) AS tjf ON tjf.object_id > 0;

DROP TABLE IF EXISTS dbo.test_join_tbl;
DROP FUNCTION IF EXISTS dbo.test_join_func;