【问题标题】:How can I get data from a stored procedure into a temp table?如何将存储过程中的数据获取到临时表中?
【发布时间】:2008-10-03 09:29:46
【问题描述】:

正在开发 sybase ASE 15。正在寻找类似的东西

Select * into #tmp exec my_stp;

my_stp 返回 10 个数据行,每行有两列。

【问题讨论】:

  • 如果你在 Sybase 上工作,为什么 ypou 用 mysql 标记问题?
  • 仅供参考 Sybase 是一家公司,而非数据库产品。您是在谈论 ASE、SQL Anywhere 还是 Sybase IQ?
  • 我感受到你的痛苦。在 ASE 下,似乎没有简单的解决方案。您要么修改 s/p,要么内联重新创建它。我认为有一种方法可以将 s/p “运行”到临时表中(不修改 s/p!),但我找不到它。 *** 我猜 Sybase 的人需要用 PostgreSQL 手册之类的东西打败。 Drat,我猜是复制一个原本没用的s / p。 *** 我真的很想知道这个问题是否得到解决(在 SQL Anywhere 之外)。

标签: sap-ase


【解决方案1】:

我相信在 ASE 15 中您可以使用函数,但它们对多行数据集没有帮助。

如果您的存储过程使用“从某处选择 col1,col2”返回数据,则无法获取该数据,它只会流回客户端。

您可以将数据直接插入到临时表中。这可能有点棘手,就像您在 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

【讨论】:

  • bad form....这个想法是在 SProc 中没有“隐藏”表....SProc 返回一个结果集并在临时表中捕获。
  • 当我 10 年前回答这个问题时,我不知道有任何方法可以做到这一点。也许您可以为详细说明“存储过程返回结果集并在临时表中捕获”的建议的问题提供相关答案?
【解决方案2】:

我刚遇到这个问题,迟到总比没有好......

这是可行的,但是非常麻烦,涉及一个 Sybase“proxy table”,它代表另一个本地或远程对象(表、过程、视图)。以下适用于 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"

注意事项:

  • “loopback”是 Sybase 等效项 本地主机,但您可以替换 它适用于在 服务器的 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

【讨论】:

  • 在 select 语句中应该是 _timestamp 而不是 _extractTimestamp。它必须与create existing table 中定义的列相匹配。
【解决方案3】:

不确定 Sybase,但在 SQL Server 中应该可以:

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

【讨论】:

  • 与OP系统无关
【解决方案4】:

如果 my_stp 通过计算来自不同表的值来填充数据,您可以创建一个与 my_stp 完全相同的等效视图。

CREATE VIEW My_view
 AS
/*
  My_stp body
*/


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

【讨论】:

  • 由此产生的开销并不理想或效率不高......当数据集变得非常大时,使用这种模式将导致严重的性能问题。
猜你喜欢
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2014-12-22
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多