请告诉我。我尝试为SQL Server写一个CLR函数。我使用Microsoft文档编写下面的函数Ref-LINK使用CLR查找祖先涉及层次结构中两个节点的常见操作是查找最低的公共祖先。这可以用Transact-SQL或CLR编写,因为hierarchyid类型都可用。建议使用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;
}
}
我尝试使用Visual Studio解决方案,但无法真正工作。然后使用互联网搜索并找到Nugget,但是我的Nugget已禁用。
。NET代码中的名称HierarchyId
在文档中似乎是type-o。 SQLCLR中只有SqlHierarchyId
。实际上,甚至在与该文档页面相关的3个已关闭问题之一中提到了此问题(在该页面的底部,单击“已关闭”选项卡):
由“ FYfrog”于2019-06-27开张。