Как использовать табличную функцию в предложении select? - PullRequest
0 голосов
/ 25 января 2020

У меня есть tableA с одним из строковых столбцов ( rawData ), и у меня есть табличная функция ( functionA ), которую функции будут принимать ' rawData 'в качестве входного параметра и возвращает пять новых полей. что будет делать эта функция? - это выполнит некоторые манипуляции со строками и разделит некоторые данные на пять значений

Мой мотив - выбрать этот строковый столбец ( rawData ) и также передать эту табличную функцию ( functionA ) и получить эти пять новых полей для каждой строки в tableA

Вот пример:

Select 
    (Select * from function (rawData))
from tableA

мои ожидания таковы, что я должен получить каждая строка с этими значениями из functionA вместе с rawData , но я получаю ошибку ниже:

В списке выбора можно указать только одно выражение когда подзапрос не введен с EXISTS.

Как мне этого добиться?

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Вы бы использовали CROSS APPLY:

SELECT a.rawData, b.*
FROM TableA a
CROSS APPLY FunctionA(a.rawdata) b
1 голос
/ 25 января 2020

Хорошо, во-первых, давайте рассмотрим, почему вы получаете ошибку. Что не так с вашим синтаксисом?

Что ж, подзапрос в предложении select должен возвращать не более одного столбца. Ваш подзапрос, используя *, возвращает все столбцы из результатов вашего вызова функции, который в данном случае представляется более чем одним.

Далее, что вы пытаетесь выполнить sh? Похоже, вы пытаетесь взять значение столбца из tableA и применить functionA к значению в этом столбце для каждой строки, возвращаемой из tableA.

Правильный синтаксис для достижения sh то есть с помощью apply. Существует как cross apply, так и outer apply. Разница между ними аналогична разнице между inner join и left join (или left outer join).

Другими словами, для cross apply, если из вызова не возвращены строки functionA для конкретной строки из tableA, тогда эта строка из tableA не будет включена. Для outer apply этот случай будет обратным, поскольку строка из tableA будет по-прежнему включена, только столбцы из вызова функции будут нулевыми.

Пример запроса с этим синтаксисом, основанный на запрос в вашем вопросе будет выглядеть следующим образом:

select fa.*
from tableA ta
outer apply functionA(ta.rawData) fa;

Обратите внимание, что я использовал outer apply в моем примере, так как ваш запрос не ожидал строки из tableA без строк, возвращаемых из functionA исключить.

...