Вставка нескольких операторов выбора в таблицу в качестве значений

Можно ли сделать что-то подобное в SQL Server:

INSERT INTO MyTable (Col1,Col2,Col3,Col4,Col5,Col6,Col7) VALUES

SELECT Col1 FROM Func1(),

SELECT Col2 FROM Func2(),

SELECT Col3,Col4,Col5 FROM Func3(),

SELECT Col6 FROM Func4(),

SELECT Col7 FROM Func5()

У меня есть большое количество функций, которые возвращают результаты с одним значением и одну функцию, которая возвращает 3 столбца. Я хотел бы вставить все эти данные в одну строку таблицы?

Я вижу, что функция, возвращающая несколько столбцов, может быть проблемой?

 mezamorphic01 июн. 2012 г., 14:37
@Nikola, если вы имеете в виду, содержит ли он & quot; возвращает таблицу как & quot; и он возвращает одну строку, да, это так.
 Nikola Markovinović01 июн. 2012 г., 14:36
Является ли Func3 () табличной функцией, возвращающей одну строку?
 mezamorphic01 июн. 2012 г., 15:26
Ваш английский был в порядке - вот как бы я это описал
 Nikola Markovinović01 июн. 2012 г., 14:42
Да, это именно то, что я имел в виду. Я виню в этом свои англоязычные навыки. Итак, все ли остальные функции одинаковы, за исключением того, что они возвращают только один столбец?

Ответы на вопрос(3)

 INSERT INTO MyTable (Col1,Col2,Col3,Col4,Col5,Col6,Col7) VALUES

 SELECT Col1 FROM Func1(),

 SELECT Col2 FROM Func2(),

 SELECT Col3 FROM (SELECT Col3,Col4,Col5 FROM Func3()),

 SELECT Col4 FROM (SELECT Col3,Col4,Col5 FROM Func3()),

 SELECT Col5 FROM (SELECT Col3,Col4,Col5 FROM Func3())

 SELECT Col6 FROM Func4(),

 SELECT Col7 FROM Func5()
 01 июн. 2012 г., 14:44
Вам нужно поставить()вокруг всех подзапросов и()вокруг комплекта.VALUES ( (SELECT x FROM y), (SELECT a FROM b), etc )
Решение Вопроса

Если все функции возвращают только одну строку ...

INSERT INTO
  MyTable (Col1,Col2,Col3,Col4,Col5,Col6,Col7)
SELECT
  f1.col1, f2.col2, f3.col3, f3.col4, f3.col5, f4.col6, f5.col7
FROM
  (SELECT Col1 FROM Func1())           AS f1
CROSS JOIN
  (SELECT Col2 FROM Func2())           AS f2
CROSS JOIN
  (SELECT Col3,Col4,Col5 FROM Func3()) AS f3
CROSS JOIN
  (SELECT Col6 FROM Func4())           AS f4
CROSS JOIN
  (SELECT Col7 FROM Func5())           AS f5

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

 18 июл. 2016 г., 13:24
@ Er.ShaileshS.Bankar Тогда ваши наборы данных не являются одиночными строками, в этом случае вам понадобится либоINNER JOIN или жеLEFT JOIN на котором вы можете указать предикат для присоединения. В этом случае откройте новый вопрос с примерами данных, примером запроса, ожидаемыми результатами и т. Д.
 15 июл. 2016 г., 11:12
Привет @ MatBailie, можем ли мы сделать это без перекрестного соединения?
 15 июл. 2016 г., 12:24
Единственный способ связать два набора данных по горизонтали - это JOIN. Поскольку эти наборы представляют собой отдельные строки и не имеют предиката для присоединения, это дает CROSS JOIN.
 15 июл. 2016 г., 13:36
да, но это дает неправильный результат. Избыточные данные.

Вы должны удалитьValues and all ","и скобки вокруг каждого оператора выбора.

Ваш ответ на вопрос