更复杂的AD distinguishedName解析

时间:2017-08-25 13:22:58

标签: sql sql-server tsql sql-server-2016

所以,我有AD distinguishedName字符串,如下所示(这是acad.ADCn的值):

CN=Surname\, Firstname (something),OU=Subdepartment,OU=Department,OU=Fixed,OU=Fixed,DC=Fixed,DC=Fixed,DC=Fixed

"固定"值是不相关的并且总是相同的,它也总是与右边的元素数量相同。部门和子部门领域是重要的事情(他们的名字可以是任何)。

我编写了以下代码来阅读Subdepartment并将其作为S.<Subdepartmentname>返回:

SELECT
    acad.ADCn
    , 'S.' + (
        SELECT
            RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(value, 'CN=', ''), 'DC=', ''), 'OU=', '')))
        FROM (
            SELECT
                ROW_NUMBER() OVER (ORDER BY (SELECT '')) AS rowid,
                value
            FROM
                STRING_SPLIT(acad.ADCn, ',')
            ORDER BY
                rowid DESC
            OFFSET 6 ROW
            FETCH FIRST 1 ROW ONLY
        ) AS splittable
    ) AS Subdepartment
    , acad.AccountName
    , acb.MailAddress
FROM
    MyDB.dbo.AccountAD AS acad
LEFT JOIN
    MyDB.dbo.AddressCB AS acb
    ON
        acad.ID
        = acb.ID

如果(并且仅当)子部门是右边的第7个元素,这很有效。但事实并非如此。还有一些用户只在一个部门内而不在一个子部门内的情况,这意味着缺少一个元素。在这种情况下,查询应返回D.<Departmentname>而不是S.<Subdepartmentname>。由于这是一个不同的嵌套级别(你必须从右边而不是第7个选择第6个元素),我发现很难扩展代码来做到这一点。

非常感谢任何帮助。

如果还不清楚,还有两个例子:

CN=Surname\, Firstname (something),OU=Coolsubdepartmentname,OU=Departmentname,OU=Fixed,OU=Fixed,DC=Fixed,DC=Fixed,DC=Fixed

应该返回:S.Coolsubdepartmentname

CN=Surname\, Firstname (something),OU=Onlydepartmentname,OU=Fixed,OU=Fixed,DC=Fixed,DC=Fixed,DC=Fixed

应该返回:D.Onlydepartmentname

此外,左侧CN=内可能有或可能没有额外的逗号,这就是为什么我总是从右侧修复元素数量的原因。

整个事情应该仍然在外部SELECT的子查询中(就像在示例代码中一样),因为我还需要从其他地方选择其他值(AccountName和MailAddress)。

0 个答案:

没有答案