所以,我有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)。