Возврат нескольких таблиц из функции T-SQL в SQL Server 2008 - PullRequest
1 голос
/ 23 ноября 2011

Вы можете вернуть одну таблицу из функции T-SQL в SQL Server 2008.

Мне интересно, можно ли вернуть более одной таблицы.

Сценарий состоит в том, что у меня есть три запроса, которые фильтруют 3 разные таблицы. Каждая таблица фильтруется по 5 таблицам фильтра, которые я хотел бы вернуть из функции; а не копировать и вставлять их создание в каждом запросе.

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

FUNCTION GetValuesA(@SomeParameter int) RETURNS @ids TABLE (ID int) AS 

  WITH Filter1 As ( Select id FROM FilterTable1 WHERE Attribute=SomeParameter )
     , Filter2 As ( Select id FROM FilterTable2 WHERE Attribute=SomeParameter )

  INSERT INTO @IDs
  SELECT ID FROM ValueTableA
  WHERE ColA IN (SELECT id FROM Filter1)
  AND   ColB IN (SELECT id FROM Filter2)

  RETURN

-----------------------------------------------------------------------------

FUNCTION GetValuesB(@SomeParameter int) RETURNS @ids TABLE (ID int) AS 

  WITH Filter1 As ( Select id FROM FilterTable1 WHERE Attribute=SomeParameter )
     , Filter2 As ( Select id FROM FilterTable2 WHERE Attribute=SomeParameter )

  INSERT INTO @IDs
  SELECT ID FROM ValueTableB
  WHERE ColA IN (SELECT id FROM Filter1)
  AND   ColB IN (SELECT id FROM Filter2)
  AND   ColC IN (SELECT id FROM Filter2)

  RETURN

Таким образом, единственное различие между двумя запросами - это фильтруемая таблица и HOW (предложение Where).

Я хотел бы знать, могу ли я вернуть Filter1 и Filter2 из функции. Я также открыт для предложений о различных способах решения этой проблемы.

Ответы [ 2 ]

5 голосов
/ 23 ноября 2011

Нет.

Концептуально, как вы ожидаете обработать функцию, которая возвращает переменное число таблиц?Вы бы JOIN на двух столах одновременно?Что, если возвращаемые поля не совпадают?

Есть ли причина, по которой у вас не может быть TVF для каждого фильтра?

3 голосов
/ 24 ноября 2011

Как говорят другие, НЕТ.Функция в TSQL должна возвращать ровно один результат (хотя этот результат может быть в форме таблицы с многочисленными значениями).

Однако есть несколько способов добиться чего-то подобного.Хранимая процедура может выполнять несколько операторов выбора и доставлять результаты до того, что называется, будь то прикладной уровень или что-то вроде SSMS.Многие библиотеки требуют добавления дополнительных команд для доступа к большему количеству наборов результатов.Например, в Pyodbc для доступа к наборам результатов после первого вам нужно вызвать cursor.nextset()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...