none
【SQL CLR】自定义聚合函数,如何让Accumulate方法向Terminate方法传值 RRS feed

  • 问题

  • 我在用C#写一个SQL聚合函数JoinString,作用是合并字符串,功能类似于string.Join(),例如有个表是这样:

    Col

    -------

    aa

    bb

    cc

    执行select dbo.JoinString(Col,'|@|') from tb后,返回aa|@|bb|@|cc,用户定义的分隔符只能在Accumulate()方法中获取,获取到该分隔符以后,我需要在Terminate方法中获取该分隔符的长度,以便将末尾的分隔符移除后再返回,但问题来了,请看:

    public void Accumulate(SqlString value, SqlString separater, SqlBoolean removeEmpty)
    {
        septrLength = separater.Value.Length;
        //DoSomething
    }

    public SqlString Terminate()
    {
        if (sb.Length != 0) { sb.Length -= septrLength; }
        return new SqlString(sb.ToString());
    }

    如上,我想通过一个类字段septrLength来存储分隔符的长度,但实践证明,Terminate()方法中获取到的septrLength永远是0,我怀疑是因为该结构体在一次聚合中被多次实例化,所以尝试改为静态字段,但这样以后又部署不了,应该是不允许有静态字段,TNND为SQL作CLR开发真是限制多多。
    求大家支招。

    • 已移动 Mike Feng 2013年1月10日 3:13 (发件人:.NET Framework 一般性问题讨论区)
    2013年1月9日 8:53

答案

全部回复