web-dev-qa-db-ja.com

ストアドプロシージャから一時テーブルにデータを取得するにはどうすればよいですか?

Sybase ASE15に取り組んでいます。このようなものを探しています

Select * into #tmp exec my_stp;

my_stpは、各行に2つの列を持つ10個のデータ行を返します。

14
user21246

ASE 15では、関数を使用できると思いますが、複数行のデータセットには役立ちません。

ストアドプロシージャが「どこかからcol1、col2を選択」してデータを返している場合、そのデータを取得する方法はなく、クライアントに逆流するだけです。

できることは、データを一時テーブルに直接挿入することです。これは、sproc内に一時テーブルを作成する場合と同じように少し注意が必要です。これは、sprocの実行が終了し、内容が表示されなくなると削除されます。このための秘訣は、sprocの外部に一時テーブルを作成することですが、それをsprocから参照することです。ここで難しいのは、sprocを再作成するたびに、一時テーブルを作成する必要があるということです。そうしないと、「テーブルが見つかりません」というエラーが発生します。


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

コードを実行するには:


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

exec my_stp
go

select * from #mine
drop table #mine
go
6
AdamH

私はちょうどこの問題に直面しました、そして決して遅くなるよりはましです...

それは実行可能ですが、別のローカルまたはリモートオブジェクト(テーブル、プロシージャ、ビュー)の代用であるSybase " プロキシテーブル "を含む、お尻の巨大な痛み。以下は12.5で動作しますが、新しいバージョンの方がうまくいくと思います。

次のように定義されたストアドプロシージャがあるとします。

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

最初にtempdbに切り替えます。

use tempdb

次に、列が結果セットと一致するプロキシテーブルを作成します。

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"

注意点:

  • 「ループバック」はSybaseでlocalhostに相当しますが、サーバーのsysserversテーブルに登録されている任意のサーバーの代わりに使用できます。
  • Sybaseがストアドプロシージャを実行すると、_timestampパラメータは@timestampに変換され、このように宣言されたすべてのパラメータ列はnullとして定義する必要があります。

次に、このようなテーブルから独自のデータベースから選択できます。

declare @myTimestamp datetime
set @myTimestamp = getdate()

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

これは十分に簡単です。次に、一時テーブルに挿入するには、最初にそれを作成します。

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

そして組み合わせる:

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