16 Stimmen

Wie kann ich Daten aus einer gespeicherten Prozedur in eine temporäre Tabelle erhalten?

Ich arbeite an sybase ASE 15. Ich suche etwas wie dieses

Select * into #tmp exec my_stp;

my_stp liefert 10 Datenzeilen mit zwei Spalten in jeder Zeile.

0 Stimmen

Wenn Sie mit Sybase arbeiten, warum haben Sie die Frage mit mysql gekennzeichnet?

0 Stimmen

Zu Ihrer Information: Sybase ist ein Unternehmen nicht ein Datenbankprodukt. Sprechen Sie über ASE, SQL Anywhere oder Sybase IQ?

0 Stimmen

Ich fühle Ihren Schmerz. Unter ASE scheint es keine einfache Lösung für dieses Problem zu geben. Entweder Sie ändern die s/p, oder erstellen sie neu inline. Ich dachte, es gäbe eine Möglichkeit, ein s/p "in" eine temporäre Tabelle laufen zu lassen (OHNE das s/p zu modifizieren!), aber ich kann sie nicht finden. *** Die Jungs bei Sybase müssen wohl mit einem PostgreSQL-Handbuch oder so geschlagen werden. Verflixt, ich mache mich auf den Weg, um ein ansonsten nutzloses s/p zu duplizieren, denke ich. *** Ich würde wirklich gerne wissen, ob dieses Problem jemals gelöst wird (außerhalb von SQL Anywhere).

6voto

AdamH Punkte 1311

In ASE 15 kann man, glaube ich, Funktionen verwenden, aber sie werden bei mehrzeiligen Datensätzen nicht helfen.

Wenn Ihr gespeicherter Prozess Daten mit einem "select col1,col2 from somewhere" zurückgibt, gibt es keine Möglichkeit, diese Daten zu erfassen, sie fließen einfach zurück zum Client.

Sie können die Daten jedoch direkt in die temporäre Tabelle einfügen. Dies kann ein wenig schwierig sein, denn wenn Sie die temporäre Tabelle innerhalb des Sprocs erstellen, wird sie gelöscht, sobald der Sproc ausgeführt wird, und Sie bekommen den Inhalt nicht zu sehen. Der Trick besteht darin, die temporäre Tabelle außerhalb des Sprocs zu erstellen, sie aber im Sproc zu referenzieren. Die Schwierigkeit dabei ist, dass Sie jedes Mal, wenn Sie die Sproc neu erstellen, die temporäre Tabelle erstellen müssen, sonst erhalten Sie die Fehlermeldung "Tabelle nicht gefunden".

    --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

Die, um den Code auszuführen:

create table #mine
(col1 varchar(3),
col2 varchar(3))
go

exec my_stp
go

select * from #mine
drop table #mine
go

5voto

Jakub Korab Punkte 4834

Ich bin gerade mit diesem Problem konfrontiert worden, und besser spät als nie...

Es ist machbar, aber eine ungeheure Arbeit, die eine Sybase " Proxy-Tabelle ", das für ein anderes lokales oder entferntes Objekt (Tabelle, Prozedur, Ansicht) steht. Das Folgende funktioniert in 12.5, neuere Versionen haben hoffentlich einen besseren Weg, dies zu tun.

Nehmen wir an, Sie haben einen Stored Proc definiert als:

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

Wechseln Sie zunächst zur tempdb:

use tempdb

Erstellen Sie dann eine Proxy-Tabelle, deren Spalten mit der Ergebnismenge übereinstimmen:

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"

Bemerkenswerte Punkte:

  • "loopback" ist das Sybase-Äquivalent von localhost, aber Sie können durch einen beliebigen Server ersetzen, der in den Servertabelle des Servers registriert ist.
  • Der Parameter _timestamp wird in @timestamp übersetzt, wenn Sybase den Stored Proc ausführt, und alle so deklarierten Parameterspalten müssen als Null definiert werden.

Sie können dann aus der Tabelle wie folgt aus Ihrer eigenen Datenbank auswählen:

declare @myTimestamp datetime
set @myTimestamp = getdate()

select * 
from tempdb..myproxy_extractSomething
where _timestamp = @myTimestamp

Das ist eigentlich ganz einfach. Um dann in eine temporäre Tabelle einzufügen, erstellen Sie diese zuerst:

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)
)

und kombinieren:

insert into #myTempExtract (column_a, column_b)
select column_a, column_b
    from tempdb..myproxy_extractSomething
    where _timestamp = @myTimestamp

-2voto

Valerion Punkte 813

Bei Sybase bin ich mir nicht sicher, aber bei SQL Server sollte folgendes funktionieren:

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

-2voto

Wenn my_stp die Daten durch Berechnung von Werten aus verschiedenen Tabellen auffüllt, können Sie einen entsprechenden View erstellen, der genau dasselbe tut wie my_stp.

CREATE VIEW My_view
 AS
/*
  My_stp body
*/

Then select data from view 
SELECT *  INTO #x FROM my_view

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X