2012-04-12 3 views
5

У меня есть хранимая процедура, которая возвращает два выбора, которые я использую в отчете. Первые выберите данные для отображения в табличном формате и второй являются метаданными для отображения в голове отчета, как показано ниже:Как SELECT [temp table1] = [subselect 1], [temp table2] = [subselect 2] FROM [Сохраненная процедура]

CREATE PROCEDURE dbo. GetReport  
@Input INT 
AS 
BEGIN   
    --Get #Metadata  
    -- #Results = f(#Metadata) … compex calculation   
    SELECT * FROM #Results  
    SELECT * FROM #Metadata  
END 

Поскольку расчет sproc довольно интенсивно, я хотел бы подготовить строки отчета как простые данные (в двух таблицах: PrecalcResults и PrecalcMetadata) для некоторых наиболее часто используемых параметров sproc за одну ночь. Скорее я бы сразу выбрал предварительно рассчитанные значения или вычислил их с помощью sproc в соответствии с параметрами.

По причинам технического обслуживания я хотел бы использовать тот же sproc для расчета данных, которые были бы: 1. показал в отчете 2. храниться в PrecalcResults и PrecalcMetadata (с используемыми параметрами)

Если я у меня был бы единственный выбор sproc. Я бы подошел к этому описанию здесь: Insert results of a stored procedure into a temporary table

Поскольку у меня есть мультиселективный sproc, я хотел бы сделать что-то вроде выше, но с двумя таблицами. В .net Я бы сделал DataSet.Tables [0] и DataSet.Tables [1] ..., но я хочу сделать это в tsql, чтобы запустить его в повседневной работе.

Возможно ли это в MS SQL?


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

+0

Поищите «нескольких активных наборов записей» (ака MARS). Вам нужно будет использовать метод «NextRecordset» для перехода от одного набора записей к другому. – HABO

ответ

2

Да, это возможно.

It's perfectly fine to return multiple result sets from a single stored procedure as you have suggested.

Ваш единственный потенциальный вопрос является ограничение на TableAdapter будучи в состоянии потянуть оба набора результатов из хранимой процедуры, but there's a very simple work-around for that issue.

+0

, если это не временная таблица, то она не будет найдена, потому что она существует только на сервере. – Taryn

+0

@bluefeet Это не было моим опытом ... это может быть проблемой с вашим уровнем доступа к данным или попыткой ссылаться на temp в отдельном соединении ... Для клиента должно быть невидимым, является ли источник для оператора select временной или не временной таблицей. –

+0

Ну, это зависит от того, как вы его используете, если у вас есть временная таблица, возвращающая данные в сохраненный proc, и вы добавляете хранимую процедуру в файл DataSet.xsd. Мой опыт в том, что он не знает о временной таблице в этой точке, поскольку он существует только на сервере. – Taryn

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