¿Cómo puedo obtener los datos a partir de un procedimiento almacenado en una tabla temporal?

Estoy trabajando en sybase ASE 15. Buscando algo como esto

Select * into #tmp exec my_stp;

my_stp devuelve 10 filas de datos con dos columnas en cada fila.

Si usted está trabajando en Sybase ¿por qué ypou etiqueta de la pregunta con mysql?
FYI Sybase es una empresa no es un producto de base de datos. Estás hablando de la ASE, SQL Anywhere, o Sybase IQ?
Siento su dolor. Bajo ASE, no parece haber ninguna solución fácil a este. Usted modificar el s/p, o recrear en línea. Pensé que había una forma de ejecutar una » s/p «en» una tabla temporal (SIN modificar el s/p!), pero yo no lo encuentro. *** Los chicos en Sybase necesidad de ser golpeado con un PostgreSQL manual o algo, supongo. Drat, fuera de duplicar un inútil, s/p, supongo. *** Me gustaría saber si esta vez se resuelve (fuera de SQL Anywhere).

OriginalEl autor user21246 | 2008-10-03

5 Kommentare

  1. 6

    En ASE 15 yo creo que se puede utilizar funciones, pero no van a ayudar con varias filas de datos.

    Si el procedimiento almacenado es devolver datos con un «select col1,col2, de algún lugar», entonces no hay forma de acaparamiento de los datos, que fluye de vuelta al cliente.

    Lo que puedes hacer es insertar los datos directamente en la tabla temporal. Esto puede ser un poco difícil, como si de crear la tabla temporal dentro del procedimiento almacenado que se elimina una vez que el procedimiento almacenado se termina de ejecutar y no llegar a ver el contenido. El truco para esto es crear la tabla temporal fuera del procedimiento almacenado, pero para hacer referencia a él desde el procedimiento almacenado. Lo difícil aquí es que cada vez que vuelva a crear el procedimiento almacenado debe crear la tabla temporal, o te vas a obtener de la tabla «no encontrado» errores.

    
        --You must use this whole script to recreate the sproc    
        create table #mine
        (col1 varchar(3),
        col2 varchar(3))
        go
        create procedure my_stp
        as
        insert into #mine values("aaa","aaa")
        insert into #mine values("bbb","bbb")
        insert into #mine values("ccc","ccc")
        insert into #mine values("ccc","ccc")
        go
        drop table #mine
        go
    

    El para ejecutar el código:

    
    create table #mine
    (col1 varchar(3),
    col2 varchar(3))
    go
    
    exec my_stp
    go
    
    select * from #mine
    drop table #mine
    go
    
    mala forma….la idea es no tener un «oculto» de la tabla dentro de un procedimiento almacenado….el procedimiento almacenado devuelve un conjunto de resultados y es capturado dentro de una tabla temporal.
    Cuando me contestó que esta hace 10 años yo no era consciente de ninguna manera de hacerlo. Tal vez usted puede proporcionar una respuesta pertinente a la cuestión que elabora su propuesta de «el procedimiento almacenado devuelve un conjunto de resultados y es capturado dentro de una tabla temporal»?

    OriginalEl autor AdamH

  2. 5

    Sólo me he enfrentado a este problema, y mejor tarde que nunca…

    Que es factible, pero una oleada de dolor en el trasero, que implica un Sybase «proxy de la tabla«, que es un suplente para otro local o remoto objeto (tabla, procedimiento, vista). Las siguientes obras 12.5, las nuevas versiones espero tener una mejor forma de hacerlo.

    Digamos que usted tiene un procedimiento almacenado definido como:

    create procedure mydb.mylogin.sp_extractSomething (
    @timestamp datetime) as
    select column_a, column_b
        from sometable
        where timestamp = @timestamp
    

    Cambiar primero a la base de datos tempdb:

    use tempdb
    

    A continuación, crear un proxy de la tabla donde las columnas coincide con el resultado conjunto de:

    create existing table myproxy_extractSomething (
    column_a int not null, -- make sure that the types match up exactly!
    column_b varchar(20) not null,
    _timestamp datetime null,
    primary key (column_a)) external procedure at "loopback.mydb.mylogin.sp_extractSomething"
    

    Puntos de la nota:

    • «loopback» es el equivalente Sybase
      de localhost, pero se puede sustituir
      para cualquier servidor registrado en el
      del servidor sysservers tabla.
    • La _timestamp parámetro se traduce a @timestamp cuando Sybase ejecuta el procedimiento almacenado, y todas las columnas de parámetros declarados como este debe ser definido como null.

    Usted puede, a continuación, seleccione de la tabla como esta de su propia db:

    declare @myTimestamp datetime
    set @myTimestamp = getdate()
    
    select * 
    from tempdb..myproxy_extractSomething
    where _timestamp = @myTimestamp
    

    Que es bastante claro. A continuación, insertar en una tabla temporal, crear primero:

    create table #myTempExtract (
        column_a int not null, -- again, make sure that the types match up exactly
        column_b varchar(20) not null,
        primary key (column_a)
    )
    

    y combinar:

    insert into #myTempExtract (column_a, column_b)
    select column_a, column_b
        from tempdb..myproxy_extractSomething
        where _timestamp = @myTimestamp
    
    Debe ser _timestamp en lugar de _extractTimestamp en la instrucción select. Tiene que coincidir con la columna definido en create existing table.
    Actualizado, gracias.

    OriginalEl autor Jakub Korab

  3. 0

    Resulta que uno puede simplemente tratar el procedimiento como una tabla como este:

    DECLARE LOCAL TEMPORARY TABLE tblLocks(connId INT);
    INSERT INTO tblLocks
    SELECT conn_id
    FROM sa_locks() -- add () after the procedure name
    

    También traté de usuario definido procedimientos con SQL Anywhere 16, funciona de la misma.

    OriginalEl autor kakugiki

  4. -1

    No está seguro acerca de Sybase, pero en SQL Server los siguientes trabajos:

    INSERT INTO #tmp (col1,col2,col3…) exec my_stp

    Gracias Valerion. Que no funciona en sybase.
    No es relevante para el sistema OP

    OriginalEl autor Valerion

  5. -1

    Si my_stp es llenar los datos mediante el cálculo de los valores de las diferentes tablas, puede crear una vista equivalente que hace exactamente lo mismo que my_stp.

    CREATE VIEW My_view
     AS
    /*
      My_stp body
    */
    
    
    Then select data from view 
    SELECT *  INTO #x FROM my_view
    
    La sobrecarga creada por esto no es lo ideal o eficiente….el uso de este patrón va a resultar en graves problemas de rendimiento cuando los conjuntos de datos a ser muy grande.

    OriginalEl autor sankardevisharath

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...