2012-05-14 4 views
0

Я много искал, но у меня нет шансов получить подзапрос, чтобы сразу возвращать сразу несколько столбцов. Следующий код работает, но это отстой:Выбор нескольких столбцов из подзапроса

SELECT 
    (SELECT Column1 FROM dbo.fnGetItemPath(ib.Id)) AS Col1, 
    (SELECT Column2 FROM dbo.fnGetItemPath(ib.Id)) AS Col2, 
    (SELECT Column3 FROM dbo.fnGetItemPath(ib.Id)) AS Col3 
FROM ItemBase ib 

Я на самом деле не получил ни малейшего представления о том, как передать ib.Id функции и получить целые столбцы Column1, COLUMN2, колонка3 без вызова функции fnGetItemPath 3 раза.

Заранее благодарен

+0

Вы можете разместить код для функции? Если это функция с табличной оценкой, она должна работать, – Dan

+0

Да, это табличная функция. Но приведенный выше код SQL действительно неэффективен, так как он должен запускать функцию 3 раза по разному, что бесполезно. Мне нужен механизм для запуска функции один раз, чтобы сразу получить три столбца. Есть идеи? –

+0

Если его функция, ориентированная на таблицу, вам не нужно делать это, как указано выше, вы можете просто выбрать SELECT * FROM dbo.fnGetItemPath (ib.Id)) – Dan

ответ

4

Вы можете переместить ti в "FROM" часть и использовать outer apply (или перекреститься).

проверка синтаксиса себя, но это должно выглядеть примерно так:

SELECT Column1, Column2, Column3 
FROM ItemBase ib 
Outer Apply dbo.fnGetItemPath(ib.Id) 
0

не работает ли это?

select 
    (select column1, column2, column3 from dbo.fnGetItemPath(ib.Id)) 
from ItemBase ib 

или вам нужно что-то еще?

+2

Нет, это не так. Он терпит неудачу, так как «Только одно выражение может быть указано в списке выбора, когда подзапрос не вводится с EXISTS». –

Смежные вопросы