【问题标题】:store and use select statement result in stored proc?在存储过程中存储和使用选择语句结果?
【发布时间】:2011-09-23 18:12:16
【问题描述】:

是否可以将选择查询的结果存储在存储过程中,然后使用存储过程中的这些结果来进一步查询结果集?

示例 // 我的存储过程(简化示例)

ALTER PROCEDURE [dbo].[users]  
AS
BEGIN

    Declare @users nvarchar(1000)            

        set @users = select * from users


    // query @users result for counts, sums where clauses, etc...


END

【问题讨论】:

  • 你还没有真正给出一个例子,为什么你不能把它写成一个单一的查询......

标签: sql sql-server tsql stored-procedures


【解决方案1】:

您希望 users 成为表变量或临时表,而不是 nvarchar 类型。

表变量版本

DECLARE @users TABLE (
    UserId int,
    ...
)

INSERT INTO @users
    (UserId, ...)
    SELECT *
        FROM users

SELECT *
    FROM AnotherTable t
        INNER JOIN @users u
            ON ...

临时表版本

CREATE TABLE #users (
    UserId int,
    ...
)

INSERT INTO #users
    (UserId, ...)
    SELECT *
        FROM users

SELECT *
    FROM AnotherTable t
        INNER JOIN #users u
            ON ...

您也可以隐式创建临时表。

SELECT *
    INTO #users
    FROM users

SELECT *
    FROM AnotherTable t
        INNER JOIN #users u
            ON ...

【讨论】:

    【解决方案2】:

    您可以使用表变量:

    DECLARE @users TABLE (...columns...);
    INSERT @users SELECT * FROM dbo.Users;
    

    虽然取决于行数,但 #temp 表通常更安全,因为它会包含统计信息,您可以创建额外的索引等。

    CREATE TABLE #users (...columns...);
    INSERT #users SELECT * FROM dbo.Users;
    

    【讨论】:

    • 嗯,表变量存在于2000
    • 你说得对,我的记忆力很差,它们是在 2000 年推出的。一定只是习惯 - 大多数很酷的功能都是在 2005 年添加的。如果 SO 强制用户使用 sql 标记会很棒-server 也至少标记一个特定版本 - 我真的很讨厌不得不猜测或询问。
    • 它们是在 2000 年推出的。请参阅:http://support.microsoft.com/kb/305977
    • @AaronBertrand 同意你的版本标签。我用 CTE、ROW_NUMBER 等回答了几个问题,结果却让 OP 回来说“抱歉,我使用的是 2000。”
    【解决方案3】:

    您可以使用临时表或表变量来做到这一点。这是一个blog post 比较选项。

    【讨论】:

      猜你喜欢
      • 2011-01-07
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多