sqlserver函数中引用递归

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver函数中引用递归相关的知识,希望对你有一定的参考价值。

请教高手,我这个语句到底哪里有语法问题?
运行提示:
消息 156,级别 15,状态 1,过程 feng1,第 18 行
关键字 'set' 附近有语法错误。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION feng1
(
@p_a nvarchar(100)
)
RETURNS nvarchar(100)
AS
BEGIN
DECLARE @p_b nvarchar(100)
with w_Storage_Depository as
(select *
from dbo.jt_T_ORG_Admin
where fiD = '+rxHWLdfS9SgtG9v9ICX+MznrtQ='
union all
select a.*
from dbo.jt_T_ORG_Admin A, w_Storage_Depository B
where A.fID = B.FParentID
)
set @p_b = (select fid from w_Storage_Depository where fid in(select fid from dbo.jt_base_company where bj=1))

return @p_b

END
GO

参考技术A set @p_b = (select fid from w_Storage_Depository where fid in(select fid from dbo.jt_base_company where bj=1))

改成

select  @p_b =fid from w_Storage_Depository where fid in(select fid from dbo.jt_base_company where bj=1)

本回答被提问者和网友采纳

在 trait 中定义的 Scala 尾递归流处理器函数持有对流头的引用

【中文标题】在 trait 中定义的 Scala 尾递归流处理器函数持有对流头的引用【英文标题】:Scala tail-recursive Stream processor function defined in trait holds reference to stream-head 【发布时间】:2012-09-11 07:01:34 【问题描述】:

以下情况

trait T 

 @tailrec
 def consume[A](as: Stream[A]): Unit = 
    if (as.isEmpty) ()
    else consume(as.tail)
  
 

object O extends T

用足够大的N 调用O.consume(Range(1, N).toStream),程序将耗尽内存,或者至少会消耗 O(N) 而不是所需的 O(1)。

【问题讨论】:

另见***.com/questions/12529697/… 【参考方案1】:

有一个简单的解决方法。只需将您的尾递归流消费者包装在另一个通过名称参数接收流的函数中:

import scala.annotation.tailrec

trait T 
  def consume[A](as: => Stream[A]): Unit = 
    @tailrec
    def loop[A](as: Stream[A]): Unit = 
        if (as.isEmpty) ()
       else loop(as.tail)
    
    loop(as)
  


object O extends T 
  def main(args: Array[String]): Unit = 
    O.consume(Range(1, 1000000000).toStream) 

转发器方法将持有对一个函数的引用,该函数计算一个表达式,其结果是一个流:

public final class O$ implements T 
  public static final MODULE$;
  // This is the forwarder:
  public <A> void consume(Function0<Stream<A>> as) 
    T.class.consume(this, as);
  
     .  .  .      

  public void main(String[] args) 
    consume(new AbstractFunction0() 
      public final Stream<Object> apply() 
        return package..MODULE$.Range().apply(1, 1000000000).toStream();
      
    );
  

【讨论】:

【参考方案2】:

为特征生成尾递归方法。 trait 扩展器中的方法入口(此处为 O)将调用转发到 trait 的方法,但在这样做的同时,它会保留对 Stream 头部的引用。

因此该方法是尾递归的,但内存仍然无法释放。补救措施:不要在特征中定义流函数,直接在对象中。

另一种方法是 scalaz 的 EphemeralStream,它持有对流头部和尾部的弱引用,并根据需要重新计算它们。

【讨论】:

EphemeralStream

以上是关于sqlserver函数中引用递归的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer :实现树形结构递归查询(无限极分类)

Sqlserver如何递归查询层级数据将父级字段和本级某个字段合并?如何自定义用户函数并调用?

记一次SqlServer骚操作——递归

sqlserver递归排序

sqlserver递归排序

sqlserver递归排序