Sql server 根据UDF结果更新表

Sql server 根据UDF结果更新表,sql-server,tsql,Sql Server,Tsql,我有一张桌子@ROOMS\u由DEPA\u KEY1制作如下: DECLARE @ROOMS_BY_DEPA_KEY1 TABLE ( OPRO_KEY INT, KAPACITETA INT, WEEK_1 DECIMAL(8,2), WEEK_2 DECIMAL(8,2), WEEK_3 DECIMAL(8,2), WEEK_4 DECIMAL(8,2),

我有一张桌子
@ROOMS\u由DEPA\u KEY1制作
如下:

DECLARE @ROOMS_BY_DEPA_KEY1 TABLE
(               
    OPRO_KEY INT,               
    KAPACITETA INT,             
    WEEK_1 DECIMAL(8,2),
    WEEK_2 DECIMAL(8,2),
    WEEK_3 DECIMAL(8,2),
    WEEK_4 DECIMAL(8,2),
    WEEK_5 DECIMAL(8,2),
    WEEK_6 DECIMAL(8,2)
)

INSERT INTO @ROOMS_BY_DEPA_KEY1(OPRO_KEY)
VALUES (160000014),(160000015),(160000016),(160000017),(160000018),(160000019),(160000020)
因此,在填充一些数据表后,如下所示:

DECLARE @ROOMS_BY_DEPA_KEY1 TABLE
(               
    OPRO_KEY INT,               
    KAPACITETA INT,             
    WEEK_1 DECIMAL(8,2),
    WEEK_2 DECIMAL(8,2),
    WEEK_3 DECIMAL(8,2),
    WEEK_4 DECIMAL(8,2),
    WEEK_5 DECIMAL(8,2),
    WEEK_6 DECIMAL(8,2)
)

INSERT INTO @ROOMS_BY_DEPA_KEY1(OPRO_KEY)
VALUES (160000014),(160000015),(160000016),(160000017),(160000018),(160000019),(160000020)

我必须使用此表中的结果更新每行列
WEEK\u 1
WEEK\u 2
WEEK\u 3
WEEK\u 4
WEEK\u 5
WEEK\u 6
,该表由
OPRO\u KEY
KAPACITETA
生成:

DECLARE @WEEKS_MONTH AS DBO.WEEKS_MONTH_Type
(
    WEEKOFMONTH INT,
    WEEKSTART DATE,
    WEEKEND DATE, 
    NO_DAYS INT, 
    AVERAGE_AVAI DECIMAL(8,2)
)
(它是表类型,因为它被用作函数参数)。该表的结果如下所示:

DECLARE @ROOMS_BY_DEPA_KEY1 TABLE
(               
    OPRO_KEY INT,               
    KAPACITETA INT,             
    WEEK_1 DECIMAL(8,2),
    WEEK_2 DECIMAL(8,2),
    WEEK_3 DECIMAL(8,2),
    WEEK_4 DECIMAL(8,2),
    WEEK_5 DECIMAL(8,2),
    WEEK_6 DECIMAL(8,2)
)

INSERT INTO @ROOMS_BY_DEPA_KEY1(OPRO_KEY)
VALUES (160000014),(160000015),(160000016),(160000017),(160000018),(160000019),(160000020)

要获得第二个表,我有一个自定义项:

dbo.f_SCAVAI_GetWeekAverage(@iOPRO_KEY, @WEEKS_MONTH, '1', @iKAPACITETA)
@WEEKS\u MONTH
中填充了一些值(weekofmonth、datestart、dateend、no\u days),并且每个调用都保持不变:

我的问题是如何为每个
OPRO\u键调用此函数,以及如何从返回的表中更新周列?

列将根据
WEEKOFMONTH
进行更新。示例:
WEEK\u 1
updatewhere
@WEEK\u MONTHS.WEEK\u OF\u MONTH
=1,
WEEK\u 2
where
@WEEK\u MONTHS
=2

如果您总是有整整6周的时间,那么按DEPA\u键1更新@ROOMS\u表的最简单方法是使用@weeks\u MONTH表的一个轴:

UPDATE @ROOMS_BY_DEPA_KEY1
SET Week_1 = w.Week_1
    ,Week_2 = w.Week_2
    ,Week_3 = w.Week_3
    ,Week_4 = w.Week_4
    ,Week_5 = w.Week_5
    ,Week_6 = w.Week_6
FROM 
   (SELECT *
    FROM (SELECT 'Week_' + CAST(WeekOfMonth AS VARCHAR) AS WeekName
            ,Average_Avai
        FROM @WEEKS_MONTH) wm
    PIVOT (MAX(Average_Avai) 
           FOR WeekName IN (Week_1, Week_2, Week_3, Week_4, Week_5, Week_6)
          )p
    ) w

我通过以下方法解决了这个问题:

UPDATE RM
                SET RM.WEEK_1 = (
                    SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY, RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 1
                ),
                RM.WEEK_2 = (
                    SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 2
                ),
                RM.WEEK_3 = (
                    SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 3
                ),
                RM.WEEK_4 = (
                    SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 4
                ),
                RM.WEEK_5 = (
                    SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 5
                ),
                RM.WEEK_6 = (
                    SELECT P.AVERAGE_AVAI FROM dbo.f_SCAVAI_GetWeekAverage(RM.DEPA_KEY,RM.OPRO_KEY, @WEEKS_MONTH, @cWorkDaysOnly, RM.KAPACITETA) P WHERE P.WEEKOFMONTH = 6
                )
                FROM @ROOMS_BY_DEPA_KEY1 RM

请以文本而不是图像的形式编写数据测试。。。或者最好直接插入:这样更容易帮助您。感谢您指出这一点,我已经更正了我的问题。
PIVOT
听起来像您要找的。