Хорошо, во-первых, давайте рассмотрим, почему вы получаете ошибку. Что не так с вашим синтаксисом?
Что ж, подзапрос в предложении 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
исключить.