Maciej Los
Лучшим решением для таких требований является использование обобщенное табличное выражение[^] (CTE) для разделения данных по запятым на строки, а затем для использования ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ[^] для объединения всех результирующих наборов, возвращаемых CTE.
Попробовать это:
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
)
--INSERT INTO YourTableNameHere ([User], Cate, [Type], Item, BU, Role)
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]
Возвращает результаты, как и ожидалось. Для получения более подробной информации, пожалуйста, смотрите:
С common_table_expression (Transact-SQL)[
^]
Использование Общих Табличных Выражений[
^]
Рекурсивные Запросы, Использующие Обобщенные Табличные Выражения[
^]
Визуальное представление SQL-соединений[
^]