Запрос результатов хранимой процедуры - PullRequest
6 голосов
/ 28 февраля 2009

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

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

Я думал сделать что-то вроде:

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

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

Спасибо!

Ответы [ 7 ]

3 голосов
/ 05 марта 2009

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

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

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

3 голосов
/ 28 февраля 2009

Приведенный ниже код работает в 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
1 голос
/ 28 февраля 2009

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

select
    <any columns you like>
from
    dbo.myFunc( 'foo', 'bar', 1 )
where
    <whatever clauses you like>
order by
    <same>
1 голос
/ 28 февраля 2009

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

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

0 голосов
/ 22 апреля 2009

У меня сейчас нет установленного Sybase, поэтому здесь может быть не прав какой-то незначительный синтаксический аспект - я не могу проверить, но в прошлом я широко его использовал: выберите * в #temp из proc_name ('arg1', 'arg2', 'arg3') должны автоматически создать для вас локальную временную таблицу с правильными столбцами. Внутри той же транзакции или блока начала / конца вы можете получить доступ к #temp с помощью select * из #temp.

0 голосов
/ 02 марта 2009

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

Допустим, хранимые процедуры выбирают Столбец1, Столбец2 и Столбец3.

Иметь таблицу (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

Надеюсь, это поможет, раньше я сталкивался с подобными проблемами, и это было лучшее, что я мог решить.

0 голосов
/ 28 февраля 2009

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

select distinct column1 from table where column1 in (your_first_query_with_all_the_arguments)

...