2014-02-11 62 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。当在一个复杂的查询中“查看”前者时,查询规划器可以(并且确实)将该函数的主体与查询的其余部分进行混合,这使得规划师能够提出可能的最佳执行计划。