【问题标题】:RETURN value to variable from query within stored procedure从存储过程中的查询返回值到变量
【发布时间】:2014-02-11 18:32:21
【问题描述】:

我有一个看起来像这样的存储过程:

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 需要返回给我需要用于其他用途的变量。

【问题讨论】:

  • 什么返回值?身份证?计数?两个都?还有什么?
  • 您在查询中硬编码的工作人员姓名?你想要吉米还是莎莉?还是两者兼而有之?
  • 好吧,确定最大队列的逻辑已经由 ORDER BY 处理...所以我只需要将工作人员的名称确定为变量,以便我可以使用它来插入记录

标签: sql sql-server-2008 tsql stored-procedures


【解决方案1】:

这不是您问题的直接答案,但如果您的所有存储过程都应该检索顶行并返回其中一列作为输出参数,您可以通过将其转换为内联表来做得更好 -值函数:

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

【讨论】:

    【解决方案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
    

    从这里,您可以在过程中使用它,更改为具有返回值的函数,或使用输出参数将其发送回调用者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2014-12-23
      • 1970-01-01
      • 2017-09-25
      相关资源
      最近更新 更多