Sql Server Присоединение наборов результатов из хранимых процедур - PullRequest
1 голос
/ 08 декабря 2011

Вот проблема.

У меня есть хранимая процедура, которая преобразует нормализованные данные в стандартный набор данных.

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

Пример

Если My View содержит что-то вроде:

ID  Title   Status  Date
1   How To Party Like a rockstar    Approved    7/15/1989
2   Too much of a good thing    Approved    7/25/2001
3   Needs More Cowbell  Denied  11/11/2011
4   Here Today Gone Tommorrow   Approved    8/13/1969
5   The way She moves   Approved    12/13/2011

И процедура, запущенная с одним параметром, возвращает:

ID  Do you like the ice Cream?  How much would you pay for the ice cream?
1   Yes 2
2   Yes 5
3   Yes 7
4   No  2
5   No  3

И то же самоепроцедура, запущенная с другим параметром, возвращает:

ID  Total Number of Bell Peppers    Total Number of Apples  Total Number of Oranges
1   7   6   6
2   6   8   8
3   32  7   5
4   7   3   1
5   12  1   1

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

ID  Title   Status  Date    Do you like the ice Cream?  How much would you pay for the ice cream?   Total Number of Bell Peppers    Total Number of Apples  Total Number of Oranges
1   How To Party Like a rockstar    Approved    7/15/1989   Yes 2   7   6   6
2   Too much of a good thing    Approved    7/25/2001   Yes 5   6   8   8
3   Needs More Cowbell  Denied  11/11/2011  Yes 7   32  7   5
4   Here Today Gone Tommorrow   Approved    8/13/1969   No  2   7   3   1
5   The way She moves   Approved    12/13/2011  No  3   12  1   1

Помня о том, что хранимые процедуры не могут быть выполнены с помощью встроенного SQL из-за характера нормализации и преобразования нормализации, и я не верю, что они могут быть выполнены как переменные таблицы udf из-за того, что хранимыеПроцедура возвращает переменное число столбцов в зависимости от параметра, который передается ей при запуске (если кто-то может доказать, что я ошибаюсь в этом, и указать мне в направлении динамического столбца с табличным значением udf, я был бы очень признателен)

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

Я также должен отметить, что на этом сервере нельзя включить специальные распределенные запросы (не мое решение)

Разрешение

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

        DECLARE
            @PivotColumns VARCHAR(MAX)

        SET @PivotColumns = dbo.fnGetFormPivotColumns(9)

Где 9 в этом случае - это параметр, который позволяет мне узнать, какой элемент яздание для.Оттуда это было просто повторение функциональности в базовом sp для динамического создания временных таблиц, поэтому я придумал следующее:

IF object_id('tempdb..#temp_DEP') IS NOT NULL
    DROP TABLE #temp_DEP


CREATE TABLE #temp_DEP (APPLICATION_ID int)
EXEC ('ALTER TABLE #temp_DEP ADD ' + @PivotColumns)

INSERT INTO #temp_DEP
    EXEC GetFormCrossTab 9 

Простой SELECT * FROM #temp_DEP показывает, что я получаю именночто я хочу.

Все, что мне нужно сделать, это повторить процесс для другого параметра, и я получу два набора данных в одной хранимой процедуре.

Ответы [ 3 ]

1 голос
/ 08 декабря 2011

Вы можете построить хранимую процедуру и использовать оператор IF для удовлетворения каждого из ваших параметров, например:

CREATE PROC someproc @parameter AS

CREATE TABLE #scratch1 (columns)...
CREATE TABLE #scratch2 (columns)...

IF @parameter = 1
BEGIN 
INSERT INTO #scratch1 
exec oldproc @parameter
END

IF @parameter = 2
BEGIN 
INSERT INTO #scratch1 
exec oldproc @parameter
END


SELECT *
FROM view v
LEFT JOIN #scratch1 s1 ON v.ID =s1.ID
...etc
1 голос
/ 08 декабря 2011

Не могли бы вы, чтобы хранимая процедура с набором условных результатов вставляла свои результаты в одну из двух рабочих таблиц, в зависимости от переданного параметра?

Затем вы могли бы создать другую хранимую процедуру, которая присоединится к вашему представлению.в рабочие таблицы.

EG, это будет новая хранимая процедура:

exec stored_proc_with_conditional_output

select * from
view v
left outer join scratch1 s1 on v.ID = s1.ID
left outer join scratch2 s2 on v.ID = s2.ID
0 голосов
/ 08 декабря 2011

Вы должны запустить запросы и разбить их вместе с linq. Это будет довольно быстро и даже может быть настроено для запуска «по требованию», поэтому объем памяти и объем обработки должны быть небольшими.

Вам нужен пример того, как это сделать, или этого предложения достаточно?

...