The best solution for such of requirements is to use
Common Table Expressions[
^] (CTE) to split data on comma into rows and then to use
CROSS JOIN[
^] to join all resultsets returned by CTE's.
Try this:
Declare @User NVARCHAR(500) = '108,124',
@Role INT = 5,
@cate INT = 1,
@Type INT = 3,
@Item NVARCHAR(500) = '3,4,5',
@BU NVARCHAR(500) = '57,58,31'
;WITH Users AS
(
SELECT CONVERT(INT, LEFT(@user, CHARINDEX(',', @User)-1)) AS U, RIGHT(@user, LEN(@User) - CHARINDEX(',', @User)) AS Remainder
WHERE CHARINDEX(',', @User)>0
UNION ALL
SELECT CONVERT(INT, LEFT(Remainder, CHARINDEX(',', Remainder)-1)) AS U, RIGHT(Remainder, LEN(Remainder) - CHARINDEX(',', Remainder)) AS Remainder
FROM Users
WHERE CHARINDEX(',', Remainder)>0
UNION ALL
SELECT CONVERT(INT, Remainder) AS U, NULL AS Remainder
FROM Users
WHERE CHARINDEX(',', Remainder)=0
), Items AS
(
SELECT CONVERT(INT, LEFT(@Item, CHARINDEX(',', @Item)-1)) AS I, RIGHT(@Item, LEN(@Item) - CHARINDEX(',', @Item)) AS Remainder
WHERE CHARINDEX(',', @Item)>0
UNION ALL
SELECT CONVERT(INT, LEFT(Remainder, CHARINDEX(',', Remainder)-1)) AS I, RIGHT(Remainder, LEN(Remainder) - CHARINDEX(',', Remainder)) AS Remainder
FROM Items
WHERE CHARINDEX(',', Remainder)>0
UNION ALL
SELECT CONVERT(INT, Remainder) AS I, NULL AS Remainder
FROM Items
WHERE CHARINDEX(',', Remainder)=0
), BUs AS
(
SELECT CONVERT(INT, LEFT(@BU, CHARINDEX(',', @BU)-1)) AS B, RIGHT(@BU, LEN(@BU) - CHARINDEX(',', @BU)) AS Remainder
WHERE CHARINDEX(',', @BU)>0
UNION ALL
SELECT CONVERT(INT, LEFT(Remainder, CHARINDEX(',', Remainder)-1)) AS B, RIGHT(Remainder, LEN(Remainder) - CHARINDEX(',', Remainder)) AS Remainder
FROM BUs
WHERE CHARINDEX(',', Remainder)>0
UNION ALL
SELECT CONVERT(INT, Remainder) AS B, NULL AS Remainder
FROM BUs
WHERE CHARINDEX(',', Remainder)=0
)
SELECT u.U AS [User], @cate As Cate, @Type AS [Type], i.I AS Item, b.B AS BU, @Role AS Role
FROM Users AS u, Items As i, BUs As b
ORDER BY [User]
Returns results as expected. For further details, please see:
WITH common_table_expression (Transact-SQL)[
^]
Using Common Table Expressions[
^]
Recursive Queries Using Common Table Expressions[
^]
Visual Representation of SQL Joins[
^]