Внешнее соединение отправляет столбец дела в функцию - PullRequest
0 голосов
/ 08 октября 2018

У меня есть этот запрос в SQL Server

SELECT 
    t.acc_no, 
    t.[group],
    t.maxgroup, t.amount, 
    t1.assigned,
    taken = CASE 
               WHEN t1.assigned = 0 THEN NULL   
               ELSE t.amount 
            END, 
    [left] = CASE 
                WHEN t1.assigned = 0 THEN NULL  
                ELSE (t.maxgroup - t1.assigned) 
             END 
FROM 
    Testtable t
OUTER APPLY 
    TestApply1(t.acc_no, t.[group], [left]) t1

, и я пытаюсь отправить столбец в своей функции, но я получаю сообщение об ошибке с неверным именем [слева], мне нужен способ как-то отправитьэтот производный столбец в моей функции.Как я могу сделать это.

ALTER FUNCTION TestApply1 
    (@accountNo INT, @group VARCHAR(30), @left INT)
RETURNS TABLE
AS
    RETURN
        (SELECT 
             assigned = SUM(CASE 
                               WHEN t1.amount > t1.maxgroup THEN t1.maxgroup  
                               ELSE t1.Amount 
                            END) 
        FROM 
            Testtable t1 
        WHERE 
            t1.acc_no = @accountNo AND t1.[group] <= @group)
    GO

1 Ответ

0 голосов
/ 09 октября 2018

Если бы у вас было нормальное определение для left, вы бы просто использовали два уровня apply:

SELECT t.acc_no, t.[group], t.maxgroup, t.amount, t1.assigned,
       taken = (CASE WHEN t1.assigned = 0 THEN NULL ELSE t.amount END),
       v.[left]
FROM Testtable t CROSS APPLY
     (VALUES (CASE WHEN t1.assigned = 0 THEN NULL  
                   ELSE t.maxgroup - t1.assigned
              END)
     ) v([left]) OUTER APPLY -- awful name for a column
    TestApply1(t.acc_no, t.[group], v.[left]) t1;

Однако ваше определение зависит от результата функции.Следовательно, то, что вы хотите сделать, плохо определено.Вы не можете делать то, что вы хотите.Это не имеет смысла.

...