带有HierarchyID的CTE突然导致解析错误

bar*_*ron 5 common-table-expression hierarchyid sql-server-2014

所以我在我的数据库中有这个自引用表Nodes,用于存储组织的树结构:

[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](max) NULL,
[ParentId] [int] NULL,
(+ other metadata columns)
Run Code Online (Sandbox Code Playgroud)

从中我使用HIERARCHYID来管理基于访问级别等的查询.我为此编写了一个表值函数tvf_OrgNodes,很久以前,在SQL Server 2008到2014年进行了测试和工作,从那以后它一直保持不变,因为它做得很好.然而,现在已经发生了一些变化,因为从路径nvarchars("/ 2/10/8 /")解析HIERARCHYID会导致以下错误,在Google上只匹配4次点击(!):

Msg 6522, Level 16, State 2, Line 26
A .NET Framework error occurred during execution of user-defined routine or aggregate "hierarchyid": 
Microsoft.SqlServer.Types.HierarchyIdException: 24000: SqlHierarchyId operation failed because HierarchyId object was constructed from an invalid binary string.
Run Code Online (Sandbox Code Playgroud)

当改变函数只返回NVARCHAR而不是实际的HIERARCHYID时,路径都看起来很好,从/根开始,接着是/2/等等.简单的选择HIERARCHYID::Parse('path')也可以正常工作.我实际上通过将路径保持为字符串一直工作,直到INSERT进入函数结果,解析那里的路径.但是,当我尝试将重新获得的数据插入到相同模式的表中时,我得到了同样的错误.

所以问题是,这是一个错误,还是有人知道使用HIERARCHYIDs的任何(新的?)陷阱< - >可能导致这种情况的路径字符串?我不知道整个二进制字符串的想法来自哪里.

这是TVF的代码:

CREATE FUNCTION [dbo].[tvf_OrgNodes] () 
RETURNS @OrgNodes TABLE (
    OrgNode HIERARCHYID, 
    NodeId INT,
    OrgLevel INT,
    ParentNodeId INT
) AS 
BEGIN       
    WITH orgTree(OrgNode, NodeId, OrgLevel, ParentNodeId) AS (
        -- Anchor expression = root node
        SELECT    
            CAST(HIERARCHYID::GetRoot() AS varchar(180)) 
            , n.Id                            
            , 0                               
            , NULL                            
        FROM Nodes n         
        WHERE ParentId IS NULL -- Top level

        UNION ALL

        -- Recursive expression = organization tree
        SELECT
            CAST(orgTree.OrgNode + CAST(n.Id AS VARCHAR(180)) + N'/' AS VARCHAR(180))     
            , n.Id                           
            , orgTree.OrgLevel + 1           
            , n.ParentId
        FROM Nodes AS n
        JOIN orgTree 
           ON n.ParentId = orgTree.NodeId
    )
    INSERT INTO @OrgNodes
    SELECT 
        HIERARCHYID::Parse(OrgNode),
        NodeId,
        OrgLevel,
        ParentNodeId
    FROM orgTree;
    RETURN;
END
Run Code Online (Sandbox Code Playgroud)

我可能最近为lolz安装了.NET 4.53 aka 4.6.除了在reg之外的任何地方都找不到它的证据:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v4.0.30319\SKUs.NETFramework,Version = v4.5.3