【问题标题】:How to query on table returned by Stored procedure within a procedure如何在过程中查询存储过程返回的表
【发布时间】:2011-03-01 15:02:29
【问题描述】:

我有一个存储过程正在执行一些 ddl dml 操作。 它在处理来自 CTE 的数据和交叉应用等复杂的事情后检索数据。

现在这会返回一个 4 个表,这些表在前端绑定到各种源。 现在我想使用其中一张表进行进一步处理,以便从中获取更多有用的信息。

例如。该表将包含大约 2000 条记录,其中我想获取仅属于住宿的记录。

PK_CATEGORY_ID       DESCRIPTION                                        FK_CATEGORY_ID       IMMEDIATE_PARENT                                   Department_ID        Department_Name                                    DESCRIPTION_HIERARCHY                                                                                                                                                                                                                                            DEPTH       IS_ACTIVE   ID_PATH                                                                                                                                                                                                                                                          DESC_PATH
-------------------- -------------------------------------------------- -------------------- -------------------------------------------------- -------------------- -------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1                    Food                                               NULL                 NULL                                               1                    Food                                               (Food) Food                                                                                                                                                                                                                                                      0           1           0                                                                                                                                                                                                                                                                Food
5                    Chinese                                            1                    Food                                               1                    Food                                               (Food) ----Chinese                                                                                                                                                                                                                                               1           1           1                                                                                                                                                                                                                                                                Food->Chinese
14                   X                                                  5                    Chinese                                            1                    Food                                               (Food) --------X                                                                                                                                                                                                                                                 2           1           1->5                                                                                                                                                                                                                                                             Food->Chinese->X
15                   Y                                                  5                    Chinese                                            1                    Food                                               (Food) --------Y                                                                                                                                                                                                                                                 2           1           1->5                                                                                                                                                                                                                                                             Food->Chinese->Y
65                   asdasd                                             5                    Chinese                                            1                    Food                                               (Food) --------asdasd                                                                                                                                                                                                                                            2           1           1->5                                                                                                                                                                                                                                                             Food->Chinese->asdasd
66                   asdas                                              5                    Chinese                                            1                    Food                                               (Food) --------asdas                                                                                                                                                                                                                                             2           1           1->5                                                                                                                                                                                                                                                             Food->Chinese->asdas
8                    Italian                                            1                    Food                                               1                    Food                                               (Food) ----Italian                                                                                                                                                                                                                                               1           1           1                                                                                                                                                                                                                                                                Food->Italian
48                   hfghfgh                                            1                    Food                                               1                    Food                                               (Food) ----hfghfgh                                                                                                                                                                                                                                               1           1           1                                                                                                                                                                                                                                                                Food->hfghfgh
55                   Asd                                                1                    Food                                               1                    Food                                               (Food) ----Asd                                                                                                                                                                                                                                                   1           1           1                                                                                                                                                                                                                                                                Food->Asd
2                    Lodging                                            NULL                 NULL                                               2                    Lodging                                            (Lodging) Lodging                                                                                                                                                                                                                                                0           1           0                                                                                                                                                                                                                                                                Lodging
3                    Room                                               2                    Lodging                                            2                    Lodging                                            (Lodging) ----Room                                                                                                                                                                                                                                               1           1           2                                                                                                                                                                                                                                                                Lodging->Room
4                    Floor                                              3                    Room                                               2                    Lodging                                            (Lodging) --------Floor                                                                                                                                                                                                                                          2           1           2->3                                                                                                                                                                                                                                                             Lodging->Room->Floor
9                    First                                              4                    Floor                                              2                    Lodging                                            (Lodging) ------------First                                                                                                                                                                                                                                      3           1           2->3->4                                                                                                                                                                                                                                                          Lodging->Room->Floor->First
10                   Second                                             4                    Floor                                              2                    Lodging                                            (Lodging) ------------Second                                                                                                                                                                                                                                     3           1           2->3->4                                                                                                                                                                                                                                                          Lodging->Room->Floor->Second
11                   Third                                              4                    Floor                                              2                    Lodging                                            (Lodging) ------------Third                                                                                                                                                                                                                                      3           1           2->3->4                                                                                                                                                                                                                                                          Lodging->Room->Floor->Third
29                   Fourth                                             4                    Floor                                              2                    Lodging                                            (Lodging) ------------Fourth                                                                                                                                                                                                                                     3           1           2->3->4                                                                                                                                                                                                                                                          Lodging->Room->Floor->Fourth
12                   Air Conditioned                                    3                    Room                                               2                    Lodging                                            (Lodging) --------Air Conditioned                                                                                                                                                                                                                                2           1           2->3                                                                                                                                                                                                                                                             Lodging->Room->Air Conditioned
20                   With Balcony                                       12                   Air Conditioned                                    2                    Lodging                                            (Lodging) ------------With Balcony                                                                                                                                                                                                                               3           1           2->3->12                                                                                                                                                                                                                                                         Lodging->Room->Air Conditioned->With Balcony
24                   Mountain View                                      20                   With Balcony                                       2                    Lodging                                            (Lodging) ----------------Mountain View                                                                                                                                                                                                                          4           1           2->3->12->20                                                                                                                                                                                                                                                     Lodging->Room->Air Conditioned->With Balcony->Mountain View
25                   Ocean View                                         20                   With Balcony                                       2                    Lodging                                            (Lodging) ----------------Ocean View                                                                                                                                                                                                                             4           1           2->3->12->20                                                                                                                                                                                                                                                     Lodging->Room->Air Conditioned->With Balcony->Ocean View
26                   Garden View                                        20                   With Balcony                                       2                    Lodging                                            (Lodging) ----------------Garden View                                                                                                                                                                                                                            4           1           2->3->12->20                                                                                                                                                                                                                                                     Lodging->Room->Air Conditioned->With Balcony->Garden View
52                   Smoking                                            20                   With Balcony                                       2                    Lodging                                            (Lodging) ----------------Smoking                                                                                                                                                                                                                                4           1           2->3->12->20                                                                                                                                                                                                                                                     Lodging->Room->Air Conditioned->With Balcony->Smoking
21                   Without Balcony                                    12                   Air Conditioned                                    2                    Lodging                                            (Lodging) ------------Without Balcony                                                                                                                                                                                                                            3           1           2->3->12                                                                                                                                                                                                                                                         Lodging->Room->Air Conditioned->Without Balcony
13                   Non Air Conditioned                                3                    Room                                               2                    Lodging                                            (Lodging) --------Non Air Conditioned                                                                                                                                                                                                                            2           1           2->3                                                                                                                                                                                                                                                             Lodging->Room->Non Air Conditioned
22                   With Balcony                                       13                   Non Air Conditioned                                2                    Lodging                                            (Lodging) ------------With Balcony                                                                                                                                                                                                                               3           1           2->3->13                                                                                                                                                                                                                                                         Lodging->Room->Non Air Conditioned->With Balcony
71                   EA                                                 3                    Room                                               2                    Lodging                                            (Lodging) --------EA                                                                                                                                                                                                                                             2           1           2->3                                                                                                                                                                                                                                                             Lodging->Room->EA
50                   Casabellas                                         2                    Lodging                                            2                    Lodging                                            (Lodging) ----Casabellas                                                                                                                                                                                                                                         1           1           2                                                                                                                                                                                                                                                                Lodging->Casabellas
51                   North Beach                                        50                   Casabellas                                         2                    Lodging                                            (Lodging) --------North Beach                                                                                                                                                                                                                                    2           1           2->50                                                                                                                                                                                                                                                            Lodging->Casabellas->North Beach
40                   Fooding                                            NULL                 NULL                                               40                   Fooding                                            (Fooding) Fooding                                                                                                                                                                                                                                                0           1           0                                                                                                                                                                                                                                                                Fooding
41                   Pizza                                              40                   Fooding                                            40                   Fooding                                            (Fooding) ----Pizza                                                                                                                                                                                                                                              1           1           40                                                                                                                                                                                                                                                               Fooding->Pizza
45                   Onion                                              41                   Pizza                                              40                   Fooding                                            (Fooding) --------Onion                                                                                                                                                                                                                                          2           1           40->41                                                                                                                                                                                                                                                           Fooding->Pizza->Onion
47                   Extra Cheeze                                       41                   Pizza                                              40                   Fooding                                            (Fooding) --------Extra Cheeze                                                                                                                                                                                                                                   2           1           40->41                                                                                                                                                                                                                                                           Fooding->Pizza->Extra Cheeze
77                   Burger                                             40                   Fooding                                            40                   Fooding                                            (Fooding) ----Burger                                                                                                                                                                                                                                             1           1           40                                                                                                                                                                                                                                                               Fooding->Burger

我使用一些包含一些 DML 操作的存储过程来获得这个结果。

我想要这样的东西

select description from exec spName where fk_category_id=5

请记住,这个 spName 正在返回 4 个表,我想对其中一个表执行一些查询,其中一个表的索引将为我所知。 在进一步查询之前,我不必将其发送到 UI。

我正在使用 Sql Server 2008,但也想要一个兼容 2005 的解决方案。

【问题讨论】:

  • 我认为您不能为 SP 放置 select 语句。最好在 sp 中使用表值函数,并对函数返回的表进行额外的操作。
  • @Chinjoo:考虑到 spName 过程返回我的单个表,比如上面的表,请给我一个例子。
  • 可以在以下行中完成: Create Proc spName ( @Parameter dataType ) AS Select * into #temptab from myFunction() 这里的函数是这样的: Create Function myFunction() returns @temp table(id INT) as begin insert @temp select * from your table return end
  • @Chinjoo:听说函数不支持dml操作。那怎么可能。据此,您提供的解决方案是不可能的。此外,“Insert @temp select * from your table”是我想要的,但这里的表是通过存储过程返回给我的。我现在没有桌子。

标签: sql sql-server database tsql stored-procedures


【解决方案1】:

编辑这不适合 4 张桌子,但您在 cmets 中说您可以转换为返回一张。

您可以为此使用OPENROWSET(Paddy 的链接问题中似乎没有提到)。这需要启用临时分布式查询。

示例用法

SELECT  *
FROM    OPENROWSET ('SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','set fmtonly off exec master.dbo.sp_who')
AS tbl

【讨论】:

  • 哪一个在性能方面会更好。您建议的或使用临时表的。
  • @Shantanu 我不知道。可能值得同时尝试它们并查看统计数据和执行计划。
  • +1 这是一个不错的方法。虽然它确实需要在服务器上启用Ad Hoc Distributed Queries
  • 我也 +1 了你的。它不太方便,但我怀疑如果存储过程返回许多记录并且需要连接到其他表,它会给出更好的执行计划。
【解决方案2】:

这是不可能的。

我能想到的唯一方法是将存储过程中的结果插入临时表并查询临时表。这在您的方案中不起作用,因为您要返回 4 个表。

你能不能把你感兴趣的查询重写为函数或视图?

编辑:

你会按照这个思路做一些事情(仅当存储过程返回一个表时)

Create Proc dbo.usp_FetchUsers

as

begin

Select UserId, UserName
From Users

End
Go

Create Table #t
(
UserId int,
UserName varchar(50)
)

Insert Into #t
Exec dbo.usp_FetchUsers

Select * From #t
Where UserId = 4

drop table #t

【讨论】:

  • 我必须执行相同的操作才能获取单个表,这不是问题。我去做。请提供例如处理单表。即将数据从 sp. 复制到临时表中。
  • 不,我不想为创建表编写查询的开销,这是唯一的选择还是其他方式也是可能的。
  • 恐怕不行 - 唯一的其他选择是按照 Martin Smith 的建议使用 OpenRowset。
  • +1 是个好方法。不接受,因为马丁的方法更方便
【解决方案3】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多