2009-02-28 22 views
6

Tengo un procedimiento almacenado que devuelve una gran cantidad de resultados, y me gustaría una mejor manera de depurar/analizar los resultados que copiar/pegar en excel o lo que sea, ¿hay alguna manera de pasar el resultados del procedimiento en una consulta? por ejemplo, si la llamada a procedimiento era algo así como:Consultar resultados de un procedimiento almacenado

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

mi idea era hacer algo como:

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

que claramente no funciona, o yo no estaría aquí. Si es importante, esto es para una base de datos de sybase.

Gracias!

+0

¿Qué versión de ASE? –

Respuesta

1

puede crear una tabla temporal (#temp) en el sp y completar el conjunto de resultados allí. Luego puede seleccionar desde la misma tabla temporal de la misma sesión. (O utilizar una tabla temporal global en Sybase con ## sintaxis temp)

Esto se debe a lo que quiere hacer (select * from sp ejecutivo) no es directamente posible en Sybase

3

El código siguiente funciona en la EM SQL 2005. No tengo una instalación de Sybase en este momento para probarlo. Si funciona en Sybase puede usar una tabla temporal (o tabla permanente) fuera de su procedimiento almacenado para que no tenga alterar el código que está tratando de probar (generalmente no es un buen procedimiento de prueba).

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

¿Es posible volver a escribir el proc almacenado como una función que devuelve una tabla? En SQL Server, esto es ciertamente posible. A continuación, puede hacer ...

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

No estoy familiarizado con Sybase, pero en MySQL se puede utilizar el parámetro IN para escribir una consulta SQL para todo esto. Ej:

select distinct column1 from table where column1 in (your_first_query_with_all_the_arguments)

0

La única forma real de solucionar este problema es crear una tabla en la base de datos para almacenar valores temporales.

Digamos que los procedimientos almacenados seleccionan Columna1, Columna2 & Columna3.

tiene una tabla (TempTable) con la columna 1, columna 2, Columna3 y establecer su procedimiento almacenado a lo siguiente:

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 

espero que esto ayude, me he encontrado con problemas similares antes y este fue el mejor Podría entrenar.

3

En SQL Anywhere 10 y 11 (no ver si se trata de ASA o ASE que está pidiendo alrededor):

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

que no tienen ASE, y no estoy seguro de si esto funciona en versiones anteriores de ASA.

0

no tengo Sybase instalado en este momento, por lo que algún aspecto sintáctico menor puede estar equivocado - No puedo comprobar, pero he usado ampliamente en el pasado: seleccione * en #temp de proc_name ('arg1', 'arg2', 'arg3') debe crear automáticamente la tabla temporal local para usted con las columnas correctas.Dentro de la misma transacción o bloque inicial/final, puede acceder a #temp por seleccione * desde #temp.

Cuestiones relacionadas