Microsoft SQL Server:拆分数据和交叉联接-计数器表-卡住

时间:2019-02-27 04:02:02

标签: sql-server tsql

我正在使用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

0 个答案:

没有答案