我可以 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 将无法在实际排序中使用索引,除非查询优化器变得非常聪明。
我有一个程序,是这样的:
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 将无法在实际排序中使用索引,除非查询优化器变得非常聪明。