Запрос результатов хранимой процедуры
У меня есть хранимая процедура, которая возвращает большое количество результатов, и мне нужен лучший способ отладки / анализа результатов, чем копирование / вставка в Excel или что-то еще - есть ли способ передать результаты процедуры в запрос? например, если вызов процедуры был примерно таким:
exec database..proc 'arg1','arg2','arg3'
моя мысль заключалась в том, чтобы сделать что-то вроде:
select distinct column1 from
(exec database..proc 'arg1','arg2','arg3')
что явно не сработало, иначе меня бы здесь не было. Если это важно, это для базы данных sybase.
Спасибо!
Ответов (7)7
вы можете создать временную таблицу (#temp) в sp и заполнить там набор результатов. Позже вы можете выбрать из той же временной таблицы из того же сеанса. (Или используйте глобальную временную таблицу в sybase с синтаксисом ## temp)
Это связано с тем, что то, что вы хотите сделать (выбрать * из exec sp), невозможно напрямую в sybase
Приведенный ниже код работает в MS SQL 2005. У меня сейчас нет установки Sybase, чтобы протестировать ее на этом. Если он работает в Sybase, вы можете использовать временную таблицу (или постоянную таблицу) вне вашей хранимой процедуры, чтобы вам не пришлось изменять код, который вы пытаетесь протестировать (в целом, не очень хорошая процедура тестирования).
CREATE TABLE dbo.Test_Proc_Results_To_Table
(
my_id INT NOT NULL,
my_string VARCHAR(20) NOT NULL
)
GO
CREATE PROCEDURE dbo.Test_Proc_Results_To_Table_Proc
AS
BEGIN
SELECT
1 AS my_id,
'one' AS my_string
END
GO
INSERT INTO dbo.Test_Proc_Results_To_Table (my_id, my_string)
EXEC dbo.Test_Proc_Results_To_Table_Proc
GO
SELECT * FROM dbo.Test_Proc_Results_To_Table
GO
Единственный реальный способ обойти эту проблему - создать в базе данных таблицу для хранения временных значений.
Допустим, хранимые процедуры выбирают Column1, Column2 и Column3.
Создайте таблицу (tempTable) с Column1, Column2, Column3 и установите для вашей хранимой процедуры следующее:
CREATE PROCEDURE database..proc
AS
BEGIN
DELETE FROM tempTable
INSERT INTO tempTable (Column1, Column2, Column3)
SELECT Column1, Column2, Column3
FROM Table1
END
then for your sql code to select the values have:
exec database..proc
SELECT Column1, Column2, Column3
FROM tempTable
Надеюсь, это поможет, я сталкивался с подобными проблемами раньше, и это было лучшее, что я мог решить.
На данный момент у меня не установлена Sybase, поэтому здесь может быть неправильный небольшой синтаксический аспект - я не могу проверить, но я часто использовал его в прошлом: выберите * в #temp from proc_name ('arg1', 'arg2' , 'arg3') должен автоматически создать для вас локальную временную таблицу с правильными столбцами. В рамках той же транзакции или блока начала / конца вы можете получить доступ к #temp, выбрав * из #temp.