Как прокомментировали другие, правильное решение состоит в том, чтобы изменить схему базы данных, чтобы иметь нормализованную схему с атомарными полями.
Решение для текущей схемы состоит в том, чтобы сначала разделить поле вложения на список номеров заказов, используя любой из доступно несколько способов сделать это. Следующим шагом является объединение результата с таблицей Orders по идентификатору, чтобы получить результаты. Третий шаг — объединить имена обратно в список. См. приведенные ссылки для пояснений разделения и объединения.
Вот фрагмент, выполняющий 3 шага:
WITH
-- Numbers table for split logic
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
Numbers AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L3),
-- The join query for step 2
bodyOrders AS
(SELECT body,
o1.name orderName
FROM Numbers AS nums
INNER JOIN Communication AS valueTable
ON nums.n <= CONVERT(int, LEN(valueTable.attachment))
AND SUBSTRING(N',' + valueTable.attachment, n, 1) = N','
INNER JOIN Orders o1
ON LTRIM(RTRIM(SUBSTRING(valueTable.attachment, nums.n,
charindex(N',', valueTable.attachment + N',', nums.n) - nums.n))) = o1.id
)
-- Concatenation logic for step 3
SELECT body,
stuff( (SELECT ','+ orderName
FROM bodyOrders b2
WHERE b2.body = b1.body
ORDER BY orderName
FOR XML PATH(''), TYPE).value('.', 'varchar(5000)')
,1,1,'')
AS orderNumbers
FROM bodyOrders b1
GROUP BY body;
Этот фрагмент не предлагает оптимального или эффективного способа сделать это для больших наборов данных. Это просто пример того, как это можно сделать, если вы должны пойти по этому пути.
Пример скрипта SQL.
person
PHeiberg
schedule
04.10.2012