2008-10-03 13 views
14

je travaille sur sybase ASE 15. Vous cherchez quelque chose comme çaComment puis-je obtenir des données d'une procédure stockée dans une table temporaire?

Select * into #tmp exec my_stp; 

my_stp retourne 10 lignes de données avec deux colonnes dans chaque rangée.

+0

Si vous travaillez sur Sybase, pourquoi avez-vous étiqueter la question avec mysql? –

+0

FYI Sybase est une entreprise * et non un produit de base de données. Parlez-vous d'ASE, de SQL Anywhere ou de Sybase IQ? –

+0

Je ressens votre douleur. Sous ASE, il semble n'y avoir aucune solution facile à cela. Vous pouvez soit modifier le s/p, soit le recréer en ligne. Je pensais qu'il y avait un moyen d'exécuter un s/p "dans" une table temporaire (SANS modifier le s/p!), Mais je ne peux pas le trouver. *** Les gars de Sybase doivent être battus avec un manuel PostgreSQL ou quelque chose, je suppose. Drat, off pour reproduire un s/p autrement inutile je suppose. *** J'aimerais vraiment savoir si cela sera résolu (en dehors de SQL Anywhere). – Roboprog

Répondre

1

ne suis pas sûr Sybase, mais dans SQL Server suivante doit fonctionner:

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

+1

Merci Valerion. Cela ne fonctionne pas dans sybase. – user21246

1

Vous ne précisez pas si vous » La procédure re stored renvoie plus d'une valeur. Si elle retourne une seule valeur, vous pouvez effectuer les opérations suivantes:

--create store procedure 
create procedure sp_returnOne 
as 
BEGIN 
return 1 
END 

--create temp table 
create table #tt (
    col1 int null 
) 

--populate temp table #tt with stored procedure 

declare @result int 
exec @result = sp_returnOne 
insert into #tt values (@result) 

select * from #tt 

drop table #tt 

Si votre sp retourne plus de valeur, alors vous devrez définir les variables de sortie dans le sp. du manuel de sybase http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/44105;pt=44072

« Une procédure stockée peut retourner plusieurs valeurs;. Chacun doit être défini comme une variable de sortie dans la procédure stockée et dans les déclarations appelant le mot-clé de sortie peut être abrégée en sortir exec. myproc @a = @myvara out, @b = @myvarb out "

Vous ne dites pas quelle version de sybase vous travaillez. Tout ce qui précède est valable pour ASE 12.5.

3

Dans Sybase SQL Anywhere,

INSERT INTO #tmp (col1,col2,col3...) select * from my_stp() 
+0

Ne fonctionne pas sous isql :( – Arkadiy

7

Dans ASE 15 Je crois que vous pouvez utiliser les fonctions, mais ils ne vont pas aider avec les jeux de données multilignes.

Si votre proc stocké retourne des données avec un "select col1, col2 de quelque part" alors il n'y a aucun moyen de saisir ces données, il revient juste au client.

Ce que vous pouvez faire est d'insérer les données directement dans la table temporaire. Cela peut être un peu délicat, car si vous créez la table temporaire dans le sproc, elle est supprimée une fois que le sproc a fini de tourner et que vous ne voyez pas le contenu. L'astuce pour cela est de créer la table temporaire en dehors du sproc, mais de la référencer depuis le sproc. Le plus dur ici est que chaque fois que vous recréer le sproc, vous devez créer la table temporaire, sinon vous obtiendrez des erreurs "table introuvable".


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

Le pour exécuter le code:


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

exec my_stp 
go 

select * from #mine 
drop table #mine 
go 
5

Je viens juste face à ce problème, et mieux vaut tard que jamais ...

Il est faisable, mais une douleur monstrueuse dans le cul , impliquant un Sybase "proxy table" qui est un standin pour un autre objet local ou distant (table, procédure, vue). Les travaux suivants en 12.5, les versions plus récentes, espérons avoir une meilleure façon de le faire.

Disons que vous avez une procédure stockée définie comme:

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

Mettez d'abord à la tempdb:

use tempdb 

Ensuite, créez une table proxy où les colonnes correspondent à l'ensemble des résultats:

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" 

Points de repère:

  • « réalimentation » est l'équivalent Sybase de localhost, mais vous pouvez remplacer pour tout serveur enregistré dans la table sysservers du serveur .
  • Le paramètre _timestamp est traduit en @timestamp lorsque Sybase exécute la procédure stockée, et toutes les colonnes de paramètres déclarées comme ceci doivent être définies comme nulles.

Vous pouvez alors choisir de la table comme celui-ci à partir de votre propre db:

declare @myTimestamp datetime 
set @myTimestamp = getdate() 

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

Ce qui est assez simple. Pour ensuite insérer dans une table temporaire, créez d'abord:

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

et se combinent:

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

Il devrait être '_timestamp' au lieu de' _extractTimestamp' dans l'instruction select.Il doit correspondre à la colonne définie dans 'create existing table' – jack3694078

+0

Mise à jour, merci. –

0

Si my_stp est peuplait données en calculant les valeurs de différentes tables, vous pouvez créer une vue équivalente qui fait exactement le même que my_stp.

CREATE VIEW My_view 
AS 
/* 
    My_stp body 
*/ 


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