我们不能使用通过引用“输出”传递的参数创建 SQL 服务器函数吗?

Posted

技术标签:

【中文标题】我们不能使用通过引用“输出”传递的参数创建 SQL 服务器函数吗?【英文标题】:Can't we Create SQL server Function with parameters that passed by reference "Output"? 【发布时间】:2011-05-30 09:54:34 【问题描述】:

SQL SERVER 避免我们在 SQL 函数中将参数作为输出“按引用传递”传递 它只是允许我们在程序中这样做 有没有办法在函数中做到这一点?

如果不是,请谁能帮我在 Select 语句中赋值

像这个例子:

Declare @X as float
set @X 
select  column1, column2,  @X = @X+ column1+column2 FROM someView

【问题讨论】:

你如何订购那张桌子? 我不太明白你想在这里实现什么。您想要一个带有计算列的结果集吗?你想返回一个值吗? LeftyX,他想要的是选择结果中每一行中前一列的总和。因此,如果行值为 (1,2,3),则输出应为 (1,3,6)。 @Vash:感谢他的澄清 ;-) 那么,我会做你所做的! “如何在 SQL Server 中获得运行总计”是否更正确? 【参考方案1】:

要产生这样的结果,您可以尝试以下解决方案:

SELECT s1.column1, s1.column2, sum(s1.column1 + s1.columns2) as res 
FROM  someView s1 cross join someView s2 
WHERE s1.[OrderColum] <= s1.[OrderColum]
GROUP BY s1.column1, s1.columns2

但是如果你没有一些订单栏,你可以试试这个解决方案

WITH someViewWithOrder AS
(
    SELECT column1,column2,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS row_id
        FROM someView
) 
SELECT s1.column1, s1.column2, sum(s1.column1 + s1.columns2) as res
    FROM someViewWithOrder s1
        INNER JOIN someViewWithOrder s2 ON s1.row_id >= b.row_id
GROUP BY s1.column1, s1.columns2;

【讨论】:

您的第二个解决方案将给出垃圾结果:它仍然是随机顺序。你不能用 SELECT 1 发明一个订单。你不能用 CROSS JOIN 有一个 ON 子句。 谢谢你 Vash,你的第一个选择是工作,我正在使用它,但我发现它需要 !n 次,这意味着只要你的数据很大,就需要很多时间......所以使用每个都会是更好的解决方案,但是如果我找到了一种在检索选择语句中分配变量的方法,那就太棒了 @gbn,是的,这很不幸,但我并没有只发明序列值的顺序,因此该语句是正确的并且不会给出垃圾结果,它可以在 column1 中使用。 【参考方案2】:

这是递归 CTE 的工作:

WITH CTE AS (
  SELECT
    Column1,
    Column2,
    rownum = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
  FROM someView
),
RecCTE AS (
  SELECT
    Column1,
    Column2,
    Total = Column1 + Column2
  FROM CTE
  WHERE rownum = 1
  UNION ALL
  SELECT
    c.Column1,
    c.Column2,
    Total = r.Total + c.Column1 + c.Column2
  FROM CTE c
    INNER JOIN RecCTE ON c.rownum = r.rownum + 1
)
SELECT *
FROM RecCTE

【讨论】:

【参考方案3】:

你可以这样分配结果

Declare @X as float

select @X = sum(column1 + column2) 
FROM someView

计算运行总数this approach 工作(快速)

【讨论】:

您可以使用,但您无法选择其他列,因为您无法将分配选择与检索数据选择一起使用 正如@gbn 提到的,你真正想要的“运行总数”是什么? 嗯,是的,我需要运行总计,但我已经尝试过 Vash 显示它需要 (N) 阶乘次的方式,比如当数据超过 5000 行时,计算需要超过一分钟,因为它每行计算 !n 次 所以我只需要知道是否有一种方法可以在检索选择语句中分配变量,这将有很大帮助......但如果我们不能不适用于每个 Statment 将只需要( N) 时间

以上是关于我们不能使用通过引用“输出”传递的参数创建 SQL 服务器函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL块之过程

方法的传递机制---引用类型传递

Java 递归 - 引用传递的替代方案:

不能通过引用传递android中的布尔变量

使用通过引用传递的参数(通过指针)优化 OpenCL 函数中的指针访问

关于mybatis的使用之怎么传递参数总结