存储过程,在返回客户端之前将结果存储在另一个表中

Posted

技术标签:

【中文标题】存储过程,在返回客户端之前将结果存储在另一个表中【英文标题】:Stored procedure, storing results in another table before returning to client 【发布时间】:2014-10-08 01:57:29 【问题描述】:

存储过程正在使用以下查询来获取结果并将结果返回给客户端。

select 
    @Lid, *         
from 
    CurrentProductSet cps 
where 
    cps.State = @state
    and cps.ProductName in (select gbb.ProductName 
                            from HMCGoodBetterBest gbb 
                            where gbb.HMC_Hospital = @hospital 
                              and gbb.HMC_Extras = @extra);

您能否指导我如何将这些结果存储在另一个表中以供进一步使用,然后再将它们返回给客户。只是不想两次获取数据或使用表变量。我创建了另一个表'Temp_CurrentProductSet'。

编辑:

我尝试使用into 子句尝试下面的代码,但出现此错误:

对象或列名丢失或为空。对于 SELECT INTO 语句,验证每一列都有一个名称。对于其他语句,请查找空别名。不允许使用定义为 "" 或 [] 的别名。将别名更改为有效名称。

代码:

select 
    @Lid, * 
into 
    Temp_CurrentProductSet
from 
    CurrentProductSet cps 
where 
    cps.State = @state
    and cps.ProductName in (select gbb.ProductName 
                            from HMCGoodBetterBest gbb 
                            where gbb.HMC_Hospital = @hospital 
                              and gbb.HMC_Extras = @extra);

【问题讨论】:

您上面的查询将结果存储在一个表中,Temp_CurrentProductSetSELECT INTO 就是这样做的。你到底想完成什么? 如果为此使用表,请注意并发性等。除非您添加代码,否则之后数据不会从表中删除,除非您做一些非常棘手的事情,否则两个不同的连接人员会运行相同的存储过程将仅使用相同的表,从而提供意想不到的结果。我建议您提供更多背景信息,说明您为什么要这样做。是否存在性能问题? 在插入中使用输出子句来显示结果 【参考方案1】:

你的问题的关键在于错误:

An object or column name is missing or empty.

您需要为您的 @Lid 字段定义一个列名,例如:

select @Lid as Lid, * 
    into Temp_CurrentProductSet
    from ...

请注意,使用SELECT INTO 会创建一个新表。如果您尝试将值插入到现有表中,则需要使用INSERT INTO SELECT

【讨论】:

谢谢,但是插入不会返回,我也想插入并选择发送给客户端。 嗯,听不懂?这会创建一个新表(不是临时表,而是真正的表),然后在您的存储过程中稍后您可以从该表中select【参考方案2】:
**You need to use output clause**

insert into Temp_CurrentProductSet output Inserted.*
select 
@Lid, *         
from 
CurrentProductSet cps 
where 
cps.State = @state
and cps.ProductName in (select gbb.ProductName 
                        from HMCGoodBetterBest gbb 
                        where gbb.HMC_Hospital = @hospital 
                          and gbb.HMC_Extras = @extra);

【讨论】:

【参考方案3】:

正如错误提示,您需要为每个列名定义别名。

试试这个,

insert into Temp_CurrentProductSet
select @Lid, *      
    from CurrentProductSet cps 
    where cps.State=@state
    and 
    cps.ProductName in (select gbb.ProductName from HMCGoodBetterBest gbb where gbb.HMC_Hospital=@hospital and gbb.HMC_Extras=@extra);

【讨论】:

谢谢,我做到了,但仍然无法解决问题。插入将插入但不会发送给客户端,我需要同时做这两件事。

以上是关于存储过程,在返回客户端之前将结果存储在另一个表中的主要内容,如果未能解决你的问题,请参考以下文章

比较两个字段并在另一个表中返回不匹配的存储过程

将存储过程的结果存储在 Google Big Query 表中

如何在另一个存储过程中调用一个存储过程(PHP 和 mysqli)

SQL存储过程多个结果到临时表中

存储过程返回2个结果数据集 - 有没有办法只将第一个数据集插入变量但仍然显示第二个?

MySQL 存储过程,获取使用游标查询的结果集