t-sql выбирает запрос с подзапросом / вызовом процедуры с 2 или более столбцами в подзапросе

#tsql #subquery

#tsql #подзапрос

Вопрос:

Я написал довольно сложный запрос на t-sql (по моим стандартам, поскольку я не администратор базы данных), в котором есть еще более сложный подзапрос, который я абстрагировал как скалярную функцию для вычисления и извлечения одного значения. Все работало хорошо, пока я не понял, что мне нужны данные из второго столбца в подзапросе / функции, и теперь я застрял. Очевидно, что я могу преобразовать функцию в proc для возврата нескольких значений (или, альтернативно, объявить подзапрос непосредственно в главном запросе), но как я могу аккуратно поместить их в родительский запрос выбора в виде отдельных столбцов?

Я знаю, что могу выполнить некоторые неуклюжие действия, такие как объединение (разделитель запятой) результатов или использовать a для XML (который мой запрос включает в себя для другого подзапроса, который возвращает данные * .. 1 из другой таблицы), но я использую Entity Framework и предпочел бы сохранить эти два конкретных значения строго типизированными. Мой поиск в Google продолжает обнаруживать использование EXISTS, но я не вижу ни одного примера того, где столбцы фактически извлекаются из запроса выбора, т. Е. он используется только для применения логики к предложению where с использованием нескольких столбцов.

Это просто то, что невозможно сделать? Мое последнее средство — попытаться объединить подзапрос в виде большего количества объединений, но я пытаюсь сохранить свой запрос читаемым, и их объединение выбросит эту идею из окна.

Заранее спасибо — «Нет, это невозможно сделать» — это также ответ, который я готов принять 🙂

Вот «новый» пример использования скалярной функции, которую я хочу изменить на сохраненный процесс, возвращающий 2 столбца:

 SELECT t1.Field1,
       t2.Field2,
       ,dbo.fn_Select_ComplexStuff(t1.Field3) AS ComplexStuff
FROM MyTable1 AS t1
INNER JOIN MyTable2 AS t2 ON t1.id = t2.id
WHERE t1.Field4 = 'Albatross'
  

Ответ №1:

Вы бы преобразовали то, что у вас есть в настоящее время в виде скалярной функции, в табличную функцию, а затем использовали оператор ПЕРЕКРЕСТНОГО ПРИМЕНЕНИЯ в вашем предложении FROM для построения конечного набора результатов.

Вы не можете создавать хранимые процедуры в других запросах, и единственный способ вернуть несколько значений (столбцов) из UDF — это получить табличное значение (поэтому он возвращает результирующий набор, а не одно скалярное значение).

Комментарии:

1. Легко, когда знаешь как!! большое спасибо за ваш ответ, он отлично сработал 🙂