我可以 select 使用 T-SQL 之前查询的 SUM 输出参数吗?

Can I select output parameters using SUM from previous query with T-SQL?

我有一个程序,是这样的:

ALTER PROCEDURE MySproc
    @Total INT OUT
AS BEGIN
    SELECT x.Column, x.Column2, SUM(x.Column) <-- I want this as an output parameter 
    FROM (
      SELECT
          Column, Column2, etc
    ) AS x

SELECT @Total = SUM(x.Column) -- Could not be bound

所以我想return一个输出参数,我知道我不能像上面那样做。我看到其他类似的问题,但我需要它作为输出参数。另外,我考虑过使用临时 table 来存储值并对其进行查询,但我质疑性能或者是否有更好的方法。

我还需要return把输出参数和结果集都传给客户端

ALTER PROCEDURE MySproc
  @Total INT OUTPUT
AS 
BEGIN
 SET NOCOUNT ON;

    SELECT @Total = SUM(x.Column) 
    FROM (
       SELECT
          Column, Column2, etc
       ) AS x
  --  ORDER BY x.Sort DESC  --<-- Not required
END

编辑

既然你已经提到你需要 return 结果集和输出参数。您将需要 运行 查询两次。

您不能将值赋给来自 select 查询的变量以及 return 结果。

您可以使用 select 查询为多个单个变量赋值,也可以使用 return 作为结果集的查询。

记住所有这些,你会像这样重写你的过程....

ALTER PROCEDURE MySproc
  @Total INT OUTPUT
AS 
BEGIN
 SET NOCOUNT ON;

  -- populate output variable 
    SELECT @Total = SUM(x.Column) 
    FROM (
       SELECT
          Column, Column2, etc
       ) AS x
  --  ORDER BY x.Sort DESC  --<-- Not required

-- Query for result set 
    SELECT *
    FROM (
       SELECT
          Column, Column2, etc
       ) AS x
  ORDER BY x.Sort DESC  
END

另外请注意,我的真实查询非常昂贵,包括大量用于生成列值的 UDF。有没有基本上不重复查询的更好方法?

你为什么要复制那些不用的昂贵的东西?
Sum(x.column) 只需要 x.column。

另一种方法是将查询结果定向到#temp 或table 变量。

又为什么要导出table(x)之类的。 x.Sort DESC 将无法在实际排序中使用索引,除非查询优化器变得非常聪明。