2011-09-23 118 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) –

相關問題