Запрос результатов хранимой процедуры

У меня есть хранимая процедура, которая возвращает большое количество результатов, и мне нужен лучший способ отладки / анализа результатов, чем копирование / вставка в Excel или что-то еще - есть ли способ передать результаты процедуры в запрос? например, если вызов процедуры был примерно таким:

exec database..proc 'arg1','arg2','arg3'

моя мысль заключалась в том, чтобы сделать что-то вроде:

select distinct column1 from 
(exec database..proc 'arg1','arg2','arg3')

что явно не сработало, иначе меня бы здесь не было. Если это важно, это для базы данных sybase.

Спасибо!

Ответов (7)

В SQL Anywhere 10 и 11 (не видел, о каком ASA или ASE вы спрашиваете):

SELECT DISTINCT Column1
FROM procName(parameter1, parameter2, parameter3);

У меня нет ASE, и я не уверен, работает ли это с более ранними версиями ASA.

вы можете создать временную таблицу (#temp) в sp и заполнить там набор результатов. Позже вы можете выбрать из той же временной таблицы из того же сеанса. (Или используйте глобальную временную таблицу в sybase с синтаксисом ## temp)

Это связано с тем, что то, что вы хотите сделать (выбрать * из exec sp), невозможно напрямую в sybase

Можно ли переписать сохраненную процедуру как функцию, возвращающую таблицу? В SQL Server это, безусловно, возможно. Тогда вы можете сделать ...

select
    <any columns you like>
from
    dbo.myFunc( 'foo', 'bar', 1 )
where
    <whatever clauses you like>
order by
    <same>

Приведенный ниже код работает в 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

Я не знаком с Sybase, но в MySQL вы можете использовать этот IN параметр, чтобы написать один SQL-запрос для всего этого. Бывший:

select distinct column1 from table where column1 in (your_first_query_with_all_the_arguments)

Единственный реальный способ обойти эту проблему - создать в базе данных таблицу для хранения временных значений.

Допустим, хранимые процедуры выбирают 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.