2009-02-28 6 views
6

Ho una procedura memorizzata che restituisce un numero elevato di risultati e vorrebbe un modo migliore di eseguire il debug/analizzare i risultati rispetto a copia/incolla in excel o altro - esiste un modo per passare risultati della procedura in una query? per esempio, se la chiamata di procedura era qualcosa di simile:Interrogare i risultati di una stored procedure

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

il mio pensiero è stato quello di fare qualcosa di simile:

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

che chiaramente non ha funzionato, o io non sarei qui. Se è importante, questo è per un database di sybase.

Grazie!

+0

Quale versione di ASE? –

risposta

1

è possibile creare una tabella temporanea (#temp) nella sp e compilare il set di risultati in tale posizione. È possibile selezionare successivamente dalla stessa tabella temporanea della stessa sessione. (Oppure utilizzare una tabella temporanea globale in Sybase con ## sintassi temp)

Questo perché ciò che si vuole fare (select * from sp exec) non è direttamente possibile in Sybase

3

Il codice di seguito funziona in MS SQL 2005. Al momento non ho installato Sybase per testarlo. Se funziona in Sybase è possibile utilizzare una tabella temporanea (o una tabella permanente) al di fuori della stored procedure in modo da non alterare il codice che si sta tentando di testare (non una procedura di test molto buona in genere.)

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

È possibile riscrivere il proc memorizzato come una funzione che restituisce una tabella? Su SQL Server questo è certamente possibile. Poi si può fare ...

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

Non ho familiarità con Sybase, ma in MySQL è possibile utilizzare il parametro IN di scrivere una query SQL per tutto questo. Es:

select distinct column1 from table where column1 in (your_first_query_with_all_the_arguments)

0

L'unico vero modo intorno a questo problema è quello di creare una tabella nel database per memorizzare i valori temporanei.

Diciamo che le stored procedure selezionano Colonna1, Colonna2 & Colonna3.

avere una tabella (TempTable) con Colonna1, Colonna2, Colonna3 e impostare la stored procedure al seguente:

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 

Spero che questo aiuta, ho incontrato problemi simili prima e questo è stato il migliore Potrei allenarmi

3

In SQL Anywhere 10 e 11 (non vedere se si tratta di ASA o ASE stai chiedendo circa):

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

non ho ASE, e non sono sicuro se questo funziona su versioni precedenti di ASA.

0

Non ho Sybase installato questo momento, quindi qualche aspetto sintattico minore può essere sbagliato qui - non posso controllare, ma l'ho usato ampiamente in passato: selezionare * in #temp da proc_name ('arg1', 'arg2', 'arg3') dovrebbe creare automaticamente la tabella temporanea locale con le colonne giuste.All'interno della stessa transazione o inizio/fine blocco è possibile accedere a #temp per selezionare * da #temp.