2014-02-11 59 views
-3

內我有一個存儲過程,看起來是這樣的:返回值從查詢變量的存儲過程

CREATE PROCEDURE dbo.Distribute 
    -- Add the parameters for the stored procedure here 
    DECLARE @COMPANYID VARCHAR(MAX); 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    --Determine who has the large queue 
    SELECT TOP 1 COMPANYID, COUNT(COMPANYID) AS 'Count', WorkerName 
    FROM TABLE 
    WHERE WorkerName IN ('Jimmy', 'Sally') 
    AND COMPANYID = @COMPANYID 
    GROUP BY COMPANYID, WorkerName 
    ORDER BY COUNT(COMPANYID) DESC 

    RETURN 

END 
GO 

我想提出的返回值到一個變量,所以我可以做的更多一些邏輯存儲過程進一步下降?

workerName需要返回到我需要用於其他事情的變量。

+1

什麼樣的返回值? ID? COUNT?都?還有別的嗎? –

+0

你已經硬編碼到查詢中的工人名稱?你想要吉米還是薩莉?或兩者? –

+0

那麼確定最大隊列的邏輯已經由ORDER BY處理......所以我只需要確定工人的名字到一個變量中,這樣我就可以用它來插入記錄 – PriceCheaperton

回答

2

試試這個把它變成一個變量:

declare @WorkerName as varchar(max) 

select 
    @WorkerName = WorkerName 
from (
    SELECT TOP 1 COMPANYID, COUNT(COMPANYID) AS 'Count', WorkerName 
    FROM TABLE 
    WHERE WorkerName IN ('Jimmy', 'Sally') 
    AND COMPANYID = @COMPANYID 
    GROUP BY COMPANYID, WorkerName 
    ORDER BY COUNT(COMPANYID) DESC 
) _Worker 

從這裏,你可以用一個返回值,用它在你的程序,改變功能,或使用輸出參數發送回呼叫者,召集者。

4

這不是直接回答你的問題,但如果你所有的存儲過程應該做的是檢索一個頂行並將其中一列作爲輸出參數返回,你可以通過將它轉換爲一個內聯表價值功能:

-- of course, you need to DROP PROCEDURE dbo.name 
-- prior to creating a function by the same name 
CREATE FUNCTION dbo.Distribute 
    @COMPANYID VARCHAR(MAX) 
RETURNS TABLE 
AS 
RETURN 
    --Determine who has the large queue 
    SELECT TOP 1 COMPANYID, COUNT(COMPANYID) AS [Count], WorkerName 
    FROM TABLE 
    WHERE WorkerName IN ('Jimmy', 'Sally') 
    AND COMPANYID = @COMPANYID 
    GROUP BY COMPANYID, WorkerName 
    ORDER BY COUNT(COMPANYID) DESC 
; 

這會給你在各種情況下的靈活性。舉例來說,你可以只返回行的是:

SELECT * FROM dbo.Distribute(...); 

或將其插入到表:

INSERT INTO dbo.SomeTargetTable (...) 
SELECT ... FROM dbo.Distribute(...); 

或者,如果,在你目前的情況,你需要存儲的值WorkName到一個變量,你可以這樣做:

SELECT @WorkName = WorkName FROM dbo.Distribute(...); 

此外,你將能夠爲列的參數返回結果(與使用在同一查詢米):

SELECT ... 
FROM dbo.SomeTable AS t 
CROSS APPLY dbo.Distribute(t.ArgumentColumn) AS d 
WHERE d.WorkerName = ... -- for an example 
; 

類似的柔韌性可以用一個存儲過程實現太,儘管有更多的編碼。您可以將結果作爲輸出參數返回並作爲一行。您仍然無法直接在查詢中使用SP的結果,與等效內聯TVF的結果相同。

最後一點,我想強調的是,最佳效果的功能應該是一個內嵌 TVF,不是多語句 TVF。當在一個複雜的查詢中「查看」前者時,查詢規劃器可以(並且確實)將該函數的主體與查詢的其餘部分進行混合,這使得規劃師能夠提出可能的最佳執行計劃。