C# SQL CLR当前上下文的“静态”变量

C# SQL CLR当前上下文的“静态”变量,c#,tsql,sqlclr,C#,Tsql,Sqlclr,我知道在DLL中使用静态变量是不安全的,但是是否有任何方法可以使用类似的变量,或者只存在于当前上下文中的变量 我要做的是创建一个UDF,它接受一个逗号分隔的字符串,并返回一个包含两列的表,一列是原始字符串中值的索引/顺序,另一列是值本身。拆分很容易,网上有很多示例,下面是我的代码,但要获得订单似乎是不可能的 我尝试过使用IDENTITY列,但不允许使用,不能在流式用户定义函数的结果表中使用“IDENTITY”列,使用静态vaiable是不可能的。在web项目中,您会得到System.web.Ht

我知道在DLL中使用静态变量是不安全的,但是是否有任何方法可以使用类似的变量,或者只存在于当前上下文中的变量

我要做的是创建一个UDF,它接受一个逗号分隔的字符串,并返回一个包含两列的表,一列是原始字符串中值的索引/顺序,另一列是值本身。拆分很容易,网上有很多示例,下面是我的代码,但要获得订单似乎是不可能的

我尝试过使用IDENTITY列,但不允许使用,不能在流式用户定义函数的结果表中使用“IDENTITY”列,使用静态vaiable是不可能的。在web项目中,您会得到System.web.HttpContext.Current,SQL项目是否有类似的内容?还是有更好的方法来实现我的目标

SQL

C


我的解决方案很有趣,写下来,走开,回来,让你看到显而易见的东西

SQL

C


如果有人可以对此进行改进,请随时发表评论。

您不能只使用SQL表函数吗?基本上,您不知道如何检索原始索引。@list变量源于C,我基本上需要从表中选择*,其中,@list ORDER中的id是@list我目前正在通过在我的存储过程中构建一个nvarchar,然后执行它来实现这一点,但我讨厌这种方法,我还想提高代码效率,我将循环str值,并在SplitToInt函数中生成结果,以便将结果流化。有点过早的优化可能我不明白你所说的是什么意思这是一篇很好的相关博客文章:
CREATE FUNCTION SplitToInt(@list nvarchar(MAX), @delim nchar(1) = N',')
RETURNS TABLE (Value int)
AS EXTERNAL NAME CompanyName.Functions.SplitToInt
GO
[SqlFunction(FillRowMethodName = "SplitToIntFillRow")]
public static IEnumerable SplitToInt(SqlString str, SqlString separator)
{
    return str.Value.Split(!separator.IsNull && separator.Value.Length > 0 ? separator.Value[0] : ',');
}

public static void SplitToIntFillRow(object row, out int Value)
{
    Value = System.Convert.ToInt32((string)row);
}
CREATE FUNCTION SplitToInt(@list nvarchar(max), @separator nchar(1) = N',')
RETURNS TABLE (InLevelOrder int, Value int)
AS EXTERNAL NAME CompanyName.Functions.SplitToInt
GO
[SqlFunction(FillRowMethodName = "SplitToIntFillRow")]
public static IEnumerable SplitToInt(SqlString str, SqlString separator)
{
    var s = str.Value.Split(!separator.IsNull && separator.Value.Length > 0 ? separator.Value[0] : ',');
    var rtn = new List<int[]>(s.Length);
    for (int i = 0; i < s.Length; i++)
        rtn.Add(new[] { i, System.Convert.ToInt32(s[i]) });
    return rtn;
}

public static void SplitToIntFillRow(object row, out int InLevelOrder, out int Value)
{
    InLevelOrder = ((int[])row)[0];
    Value = ((int[])row)[1];
}