0

我有这个简单的 C# 代码,Sql Server 使用它来返回TVF

[SqlFunction(FillRowMethodName = "FillRow3")]
public static IEnumerable GetCsv(string csv)
{
    string[] arr = csv.Split(',');
    return arr;
}

public static void FillRow3(Object obj, out int val, out int index)
{
    val = int.Parse((string)obj) ;
    index =  ??? <----------?
}

但是-我想返回一个包含 2 列的表: ( val,index)

如何根据每行返回其索引(从 0 开始)arr

obj是来自的arr。)

MyItemps - 我可以在方法中创建一个包含 [value,index]的数组GetCsv
然后 - obj 行 (val+index) 将对FillRow3方法可见。但我不想那样做。

4

2 回答 2

0

我解决了。

我想在以下位置制作一个计数器:

public static void FillRow3(Object obj, out int val, out int index)
{

}

但它必须是静态的。

所以我尝试创建一个静态字段:

public static   int g = 0;
public static void FillRow2(Object obj, out int val, out int index)
{
    val = (int.Parse((string) obj)*2);
    int h = g;
   index = h++;
}

但随后 SQL 喊道:

CREATE ASSEMBLY 失败,因为安全程序集“MyDll2”中的类型“Class1”具有静态字段“g”。安全程序集中静态字段的属性必须在 Visual C# 中标记为只读,在 Visual Basic 中标记为只读,在 Visual C++ 和中间语言中标记为 initonly。

但如果我有一个readonly int- 我将无法改变它。

所以我为它创建了一个包装器引用对象int

引用不会改变,Int...... :)

所以我的最终解决方案是:

 

  public class MyCounter
    {
        public  int cnt;
    }  


    public static readonly MyCounter mc = new MyCounter();

    public static void FillRow2(Object obj, out int val, out int index)
    {
        val = (int.Parse((string) obj)*2);

        index = mc.cnt++;
    }

和..................

在此处输入图像描述

于 2012-08-04T18:41:20.023 回答
0

它应该如下所示:

[SqlFunction(FillRowMethodName = "FillRow3")]
public static IEnumerable GetCsv(string csv)
{
    string[] arr = csv.Split(',');
    return arr.Select((x, i) => Tuple.Create(x, i));
}

public static void FillRow3(Object obj, out string val, out int index)
{
    var input = (Tuple<string, int>)obj;
    val = input.Item1;
    index = input.Item2;
}

请注意,不需要静态变量。如果您认为 SQL Server 内部的静态不是问题,请研究此问题。

于 2012-08-04T22:15:20.760 回答