В конце я использовал второй ответ Ливена, но обнаружил, что для некоторых комбинаций строк трюк FOR XML PATH('')
вызывает проблемы:
declare @phrases table
(
id int
,phraseId int
,seqNum int
,word varchar(10)
)
insert
@phrases
values
(1,1,1,'hello'),
(2,1,2,'world'),
(3,2,1,'black'),
(4,2,2,'and'),
(5,2,3,'white')
SELECT
DISTINCT p1.PhraseID,
STUFF(
(
SELECT
' ' + p2.word
FROM
@phrases AS p2
WHERE
p2.PhraseID = p1.PhraseID
FOR XML PATH('')
), 1, 1, '') AS completePhrase
FROM
@phrases AS p1
ORDER BY
p1.PhraseID
работает нормально, но если в примере используются символы, которые должны были бы быть экранированы, если бы они использовались в XML, возникают проблемы. Например, через него проходят следующие данные:
insert
@words
values
(1,1,1,'hello>'), --notice the less than symbol
(2,1,2,'world'),
(3,2,1,'black')
Придает
hello> world
а также, если исходная таблица объявлена не по порядку, требуется order by
Небольшой мод к исходному запросу исправляет все:
SELECT
DISTINCT p1.PhraseID,
STUFF(
(
SELECT
' ' + p2.word
FROM
@words AS p2
WHERE
p2.PhraseID = p1.PhraseID
ORDER BY
p2.seqNum --required
FOR XML PATH(''),TYPE
).value('.','nvarchar(4000)'),
1,
1,
''
) AS completePhrase
FROM
@words AS p1
ORDER BY
p1.PhraseID
(см. ДЛЯ ПУТИ XML (''): экранирование "специальных" символов )