【问题标题】:SQL Server: run function for each row based on the provided row valueSQL Server:根据提供的行值对每一行运行函数
【发布时间】:2017-04-08 09:30:05
【问题描述】:

我仍在学习 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 开始和结束日期,始终从第一个表返回每个项目记录的所有周数。

我想知道,我该如何做到这一点,使用 first_tables start_date 和 end_date 值,以便我的交叉应用只返回包含在行开始/结束日期中的 week_intervals 的记录。

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

【问题讨论】:

  • 您的First_table 包含什么内容以及您的预期结果是什么?
  • 请以第一张表中的数据和最终结果为例进行说明。
  • 首先,感谢您写了一个经过深思熟虑和详细的问题。如果您正在学习 SQL,请接受一些建议:它不像编程那样为所有内容编写函数并调用该函数。您应该考虑做一个“基于集合”的解决方案。在这种情况下,这意味着创建一个包含所有可能值的日历表并加入它。当您使用函数时,它们在 100 行、1000 行、10,000 行中都可以正常工作,但最终随着行数的增加,性能会下降到最低点,而您不得不匆忙重写一些东西。

标签: sql sql-server


【解决方案1】:
select * 
from   First_table cross apply [udf_GetIntervals]([Allocation_start],[Allocation_end])

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      相关资源
      最近更新 更多