Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQl server TVF CLR函数是否返回行索引?_C#_.net_Sql Server_Sql Server 2008_Sqlclr - Fatal编程技术网

C# SQl server TVF CLR函数是否返回行索引?

C# SQl server TVF CLR函数是否返回行索引?,c#,.net,sql-server,sql-server-2008,sqlclr,C#,.net,Sql Server,Sql Server 2008,Sqlclr,我有一个简单的C代码,Sql Server使用它返回TVF: 我想返回一个有两列的表:val,index 如何根据arr返回基于索引0的每一行 obj是来自arr的行 p、 s- 我可以创建一个MyItem数组,该数组将在GetCsv方法中包含[value,index]。 然后-obj row val+index将对FillRow3方法可见。 但我不想那样做。我解决了它 我想在以下方面制作一个计数器: public static void FillRow3(Object obj, out int

我有一个简单的C代码,Sql Server使用它返回TVF:

我想返回一个有两列的表:val,index

如何根据arr返回基于索引0的每一行

obj是来自arr的行

p、 s- 我可以创建一个MyItem数组,该数组将在GetCsv方法中包含[value,index]。 然后-obj row val+index将对FillRow3方法可见。 但我不想那样做。

我解决了它

我想在以下方面制作一个计数器:

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大喊:

创建程序集失败,因为安全程序集“MyDll2”中的类型“Class1” 有一个静态字段“g”。安全程序集中静态字段的属性 必须在Visual C中标记为只读,在Visual Basic中标记为只读,或 仅在Visual C++和中间语言中使用。 但是如果我有一个只读的int,我将无法更改它

所以我创建了一个指向该int的包装器引用对象

引用不会改变,Int将…:

因此,我的最终解决方案是:


应该是这样的:

[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内部的静态状态是一个问题,请研究此问题。

请参阅此帖子@WaqarJanjua,谢谢,但没有太大帮助。他没有使用静态分析项目位置,您正在使用函数在并发线程之间引入竞争条件。如果SQL Server并行执行您的查询或执行多个查询,您将得到不正确的结果。@usr我在GetCsv中使用锁。这将只允许1个线程执行其任务-一次一个。但是,每次点火应从0开始。现在它从最后一个整数开始…我应该看看我是如何修复它的。首先,调用GetCsv。然后,反复调用FillRow。您不使用锁定来保护这两个,您只保护GetCsv。摆脱静态。请不要把这样的代码放在互联网上。我很想正确地回答这个问题,但你可以在网上找到正确的例子:请删除这篇文章,因为人们会按字面意思粘贴它,然后射中自己的脚。@usr你的链接有什么帮助?它只有一个简单的代码,没有索引情况。。。我不明白你为什么粘贴it@usr关于这个主题的文档非常糟糕。它在哪里说首先调用getcsv,然后重复调用FillRow?如果是这种情况,那么我必须在GetCsv方法中填充索引。我忽略了这个方法,因为我找不到任何原因。为什么要设置此约束?因为我想看看是否可以用秒方法处理索引。,
  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++;
    }
[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;
}