Используйте функцию CLR для преобразования Hierarchyid в строку в Visual Studio 2019 - PullRequest
2 голосов
/ 01 марта 2020

Пожалуйста, сообщите мне. Я пытаюсь написать CLR функцию для SQL сервера. Я использую документ Microsoft для записи ниже функции Ref-LINK Поиск предков с помощью CLR Обычной операцией, включающей два узла в иерархии, является поиск наименьшего общего предка. Это может быть записано в Transact- SQL или CLR, потому что тип иерархии доступен в обоих. Рекомендуется CLR, потому что производительность будет выше.

Используйте следующий код CLR, чтобы перечислить предков и найти наименьшего общего предка:

using Microsoft.SqlServer.Server;
using Microsoft.SqlServer.Types;
using System;
using System.Collections;
using System.Text;

public partial class HierarchyId_Operations
{
    [SqlFunction(FillRowMethodName = "FillRow_ListAncestors")]
    public static IEnumerable ListAncestors(SqlHierarchyId h)
    {
        while (!h.IsNull)
        {
            yield return (h);
            h = h.GetAncestor(1);
        }
    }
    public static void FillRow_ListAncestors(
        Object obj,
        out SqlHierarchyId ancestor
        )
    {
        ancestor = (SqlHierarchyId)obj;
    }

    public static HierarchyId CommonAncestor(
        SqlHierarchyId h1,
        HierarchyId h2
        )
    {
        while (!h1.IsDescendantOf(h2))
            h1 = h1.GetAncestor(1);

        return h1;
    }
}

Но я вижу эту ошибку: enter image description here

Я пытаюсь использовать решения Visual Studio, но не работает по-настоящему. затем используйте inte rnet search и найдите Nugget, но мой самородок отключен.
enter image description here

1 Ответ

1 голос
/ 01 марта 2020

Имя HierarchyId в коде. NET выглядит как type-o в документации. В SQLCLR есть только SqlHierarchyId. Фактически, это даже упоминалось в одном из 3 закрытых вопросов, связанных с этой страницей документации (в нижней части этой страницы щелкните вкладку «Закрыто»):

Корректность CommonAncestor

Открыт "FYfrog" в 2019-06-27.

...