我正在使用Microsoft SQL。 首先让我解释一下,当我输入的数据没有所有的cn和路径以及xml数据时,此SQL脚本中的“ splitter”命令就可以使用。如果数据以
的形式出现testrole|testrole2|testrole3
我正在尝试将其引入原始数据中。它仍将以管道分隔,但在角色/访问名称之后会有更多的字符串数据。因此,我以后可以使用它批量编写脚本。
我希望最终结果是用户ID-角色,并为具有多个角色的用户显示重复的用户ID。
1-TestRole
2-TestRole
2-TestApp
3-TestApp
关于如何使它起作用的任何想法?您可以看到某些用户将具有一个角色,而其他多个角色。
if OBJECT_ID ('tempdb.dbo.#RolesStage2') IS NOT NULL
DROP TABLE #RolesStage2
DECLARE @CountTable TABLE (UserID BIGINT)
INSERT INTO @CountTable
VALUES (1), (2), (3), (4)
DECLARE @TempUserObjects TABLE
(
UserID BIGINT,
AssignedRoles NVARCHAR(MAX)
)
INSERT INTO @TempUserObjects (UserID, AssignedRoles)
VALUES
(1, 'cn=TestingApp1,cn=Application,cn=Base,cn=Level2,cn=Definitions,cn=Configuration,cn=Drivers,cn=UserApplication,cn=FakePath,<assignment><start_tm>123456789575</start_tm><req_tm>1234568789854</req_tm><req>cn=FakeAdmin,ou=Admin,ou=ESC,o=authorizationpathfake</req><req_desc>Import - Child Request</req_desc></assignment>|'),
(2, 'cn=TestingApp2,cn=Application,cn=Base,cn=Level2,cn=Definitions,cn=Configuration,cn=Drivers,cn=UserApplication,cn=FakePath,<assignment><start_tm>123456789575</start_tm><req_tm>1234568789854</req_tm><req>cn=FakeAdmin,ou=Admin,ou=ESC,o=authorizationpathfake</req><req_desc>Import - Child Request</req_desc></assignment>|'),
(3, 'cn=TestingApp3,cn=Application,cn=Base,cn=Level2,cn=Definitions,cn=Configuration,cn=Drivers,cn=UserApplication,cn=FakePath,<assignment><start_tm>123456789575</start_tm><req_tm>1234568789854</req_tm><req>cn=FakeAdmin,ou=Admin,ou=ESC,o=authorizationpathfake</req><req_desc>Import - Child Request</req_desc></assignment>|cn=RoleTest3,cn=Application,cn=Base,cn=Level2,cn=Definitions,cn=Configuration,cn=Drivers,cn=UserApplication,cn=FakePath,<assignment><start_tm>123456789575</start_tm><req_tm>1234568789854</req_tm><req>cn=FakeAdmin,ou=Admin,ou=ESC,o=authorizationpathfake</req><req_desc>Import - Child Request</req_desc></assignment>'),
(4, 'cn=RoleTest1,cn=Application,cn=Base,cn=Level2,cn=Definitions,cn=Configuration,cn=Drivers,cn=UserApplication,cn=FakePath,<assignment><start_tm>123456789575</start_tm><req_tm>1234568789854</req_tm><req>cn=FakeAdmin,ou=Admin,ou=ESC,o=authorizationpathfake</req><req_desc>Import - Child Request</req_desc></assignment>|cn=RoleTest5,cn=Application,cn=Base,cn=Level2,cn=Definitions,cn=Configuration,cn=Drivers,cn=UserApplication,cn=FakePath,<assignment><start_tm>123456789575</start_tm><req_tm>1234568789854</req_tm><req>cn=FakeAdmin,ou=Admin,ou=ESC,o=authorizationpathfake</req><req_desc>Import - Child Request</req_desc></assignment>')
SELECT
*
FROM
@TempUserObjects
--Splitter Statement
SELECT
tuo.UserID,
SUBSTRING('|' + tuo.AssignedRoles + '|', ct.UserID + 1, CHARINDEX('|', '|' + tuo.AssignedRoles + '|', ct.UserID + 1) - ct.UserID - 1) AS 'NRFAssignedRoles'
INTO
#RolesStage2
FROM
@CountTable ct
CROSS JOIN
@TempUserObjects tuo
WHERE
ct.UserID < LEN('|' + tuo.AssignedRoles + '|')
AND SUBSTRING('|' + tuo.AssignedRoles + '|', ct.UserID, 1) = '|'
--Shows SubstringCharindex works
SELECT
SUBSTRING(AssignedRoles, 4, CHARINDEX(',', AssignedRoles) - 4) AS 'SubstringCharindex'
FROM
@TempUserObjects
SELECT *
FROM #RolesStage2