SQL Server : run function for each row based on the provided row value

标签 sql sql-server

我仍在学习 SQL,并且想知道如何将行值传递到交叉应用 查询中的函数中。

假设这是我的第一个表

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/

相关文章:

sql - ORA-30483 : window functions are not allowed here

sql-server - 我如何将命令传递给 sqsh 并一次性将输出输出到文件?

java - 如何将表值参数从java传递到sql server存储过程?

sql - 分配具有不同记录的变量

sql-server - SQL : Concatenate column values in a single row into a string separated by comma

mysql - SQL 查询返回最常见、第二常见、第三常见的情况

php - 电视节目推荐算法和 SQL

sql - 是否有必要将交易放在这段代码中?

php - 在php中的sql更新查询中使用保留字会覆盖整个表

sql - Oracle 查询以识别具有特殊字符的列