我们不能使用通过引用“输出”传递的参数创建 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 服务器函数吗?的主要内容,如果未能解决你的问题,请参考以下文章