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

假设这是我的第一张 table

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 的记录。

我将不胜感激有关此事的任何提示。

最佳答案

您可以使用 APPLY 执行按行操作。 CROSS APPLY 的行为类似于 INNER JOIN ,而 OUTER APPLY 更像 LEFT JOIN

表值函数返回一个表。您必须提供别名并将此结果集包含到您的列列表中:

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

关于SQL Server : run function for each row based on the provided row value,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40780274/

10-13 04:48