2011-09-23 112 views
3

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

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

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

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

回答

6

你想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 ... 
1

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

2

您可以使用一个表变量:

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

虽然根据行数,一个#temp表往往是更安全,因为它会统计,你可以创建额外的索引等

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

这个表格变量存在于[2000](http://msdn.microsoft.com /en-us/library/aa260638(v=sql.80).aspx) –

+0

你说得对,我的记忆力不好,他们是在2 000.必须是习惯 - 大多数酷功能都是在2005年添加的。虽然如果强迫用户使用sql-server标记至少还有一个特定版本的标签,那么这将非常棒 - 我真的很憎恨不得不猜测或询问。 –

+0

它们是在2000年推出的。请参阅:[http://support.microsoft.com/kb/305977](http://support.microsoft.com/kb/305977) –

相关问题