SQL CLR - «Статическая» переменная для текущего контекста - PullRequest
3 голосов
/ 05 марта 2012

Я знаю, что использование статической переменной в вашей DLL небезопасно, но есть ли способ получить нечто подобное или переменную, которая существует только для текущего контекста?

То, что я пытаюсь сделать, - это создать UDF, который принимает строку, разделенную запятыми, и возвращает таблицу с двумя столбцами, один - это индекс / порядок значения в исходной строке, другая - сама ценность. Разделить легко (есть много примеров в сети, мой код ниже), но получить заказ кажется невозможным.

Я пытался использовать столбец IDENTITY, но он не разрешен («Не удается использовать столбец« IDENTITY »в таблице результатов потоковой пользовательской функции»), и использование статической переменной не рекомендуется. идти. В веб-проекте вы получаете System.Web.HttpContext.Current, есть ли что-нибудь подобное для проекта SQL? Или есть лучший способ сделать то, что я ищу?

SQL

CREATE FUNCTION SplitToInt(@list nvarchar(MAX), @delim nchar(1) = N',')
RETURNS TABLE (Value int)
AS EXTERNAL NAME CompanyName.Functions.SplitToInt
GO

C #

[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);
}

1 Ответ

1 голос
/ 06 марта 2012

Мое решение (забавно, как при записи, уходе и возвращении вы видите очевидное)

SQL

CREATE FUNCTION SplitToInt(@list nvarchar(max), @separator nchar(1) = N',')
RETURNS TABLE (InLevelOrder int, Value int)
AS EXTERNAL NAME CompanyName.Functions.SplitToInt
GO

C #

[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];
}

Если кто-то может улучшить это, не стесняйтесь комментировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...