SQL Server:根据提供的行值为每一行运行函数

时间:2016-11-24 07:26:16

标签: sql sql-server

我还在学习SQL,我在徘徊,如何将行值传递给cross apply查询中的函数。

假设这是我的第一张表

SELECT 
    [Project], [emp_id],
    [Allocation_start], [Allocation_end]
FROM
    First_table

我有一个带2个参数的函数 - 开始和结束日期,并返回按周间隔分割的日期...

示例:

select * from [udf_GetIntervals]('2017-01-01','2017-01-30')

数据:

dt_start    dt_end
----------------------
2016-12-26  2017-01-01 
2017-01-02  2017-01-08 
2017-01-09  2017-01-15 
2017-01-16  2017-01-22 
2017-01-23  2017-01-29 
2017-01-30  2017-02-05 

我所做的是运行提到的函数,日期从7月1日到12月30日,并存储在虚拟表中,然后用于交叉应用该表。

select * 
from [First_table] 
cross apply
    (select * from #temp) b

哪个有效,但它独立于first_tables开始和结束日期,始终从第一个表中返回每1个项目记录的所有周数。

我想知道,我怎么能这样做,使用first_tables start_date和end_date值,这样我的交叉应用只返回行开始/结束日期中包含week_intervals的记录。

我很感激有关此事的任何暗示。

2 个答案:

答案 0 :(得分:5)

您可以使用APPLY执行行式操作。 CROSS APPLY的行为与INNER JOIN相似,而OUTER APPLY则与LEFT JOIN相似。

Table-Valued-Function 返回一个表。您必须提供别名并将此结果集包含在列列表中:

SELECT [Project]
      ,[emp_id]
      ,[Allocation_start]
      ,[Allocation_end]
      ,WeekDates.*
From First_table
CROSS APPLY dbo.[udf_GetIntervals]([Allocation_start],[Allocation_end]) AS WeekDates

答案 1 :(得分:3)

select * 
from   First_table cross apply [udf_GetIntervals]([Allocation_start],[Allocation_end])