Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 For xml path добавить разделитель  [new]
Nechto
Member

Откуда:
Сообщений: 829
Здравствуйте.

Подскажите пожалуйста как можно добавить разделитель между сложенными символьными строками?

DECLARE @T TABLE (ID int, Name nvarchar(max))
INSERT @T
SELECT 11 as FF, 'Misv 11' as RR
UNION ALL SELECT 11, 'DFE' 
UNION ALL SELECT 22, 'fDD ds' 
UNION ALL SELECT 22, 'ds 15'


SELECT ID,
       (SELECT Name as 'data()' FROM @T WHERE ID = D.ID FOR XML PATH(''))
  FROM @T D  
 GROUP BY ID


Чтобы результат был не такой :

11	Misv 11 DFE
22 fDD ds ds 15

А такой :

11	Misv 11 - DFE
22 fDD ds - ds 15

В общем с добавлением дефиса, между двумя сложенными символьными строками.
7 июл 14, 11:17    [16268399]     Ответить | Цитировать Сообщить модератору
 Re: For xml path добавить разделитель  [new]
Glory
Member

Откуда:
Сообщений: 104760
(SELECT Name+'-' as 'data()' FROM @T WHERE ID = D.ID FOR XML PATH(''))
7 июл 14, 11:21    [16268421]     Ответить | Цитировать Сообщить модератору
 Re: For xml path добавить разделитель  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
SELECT D.ID,
 STUFF
 (
  (
   SELECT '-'+T.Name
   FROM @T T
   WHERE T.ID = D.ID
   FOR XML PATH('')
  )
  ,1,1,''
)
FROM @T D  
GROUP BY T.ID
7 июл 14, 11:22    [16268434]     Ответить | Цитировать Сообщить модератору
 Re: For xml path добавить разделитель  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Пробелы сбоку от дефиса нужны?
SELECT D.ID,
 STUFF
 (
  (
   SELECT ' - '+T.Name
   FROM @T T
   WHERE T.ID = D.ID
   FOR XML PATH('')
  )
  ,1,3,''
)
FROM @T D  
GROUP BY T.ID;
7 июл 14, 11:24    [16268443]     Ответить | Цитировать Сообщить модератору
 Re: For xml path добавить разделитель  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Только вот спецсимволы XML в поле Name (если есть) всё дело испортят.
SELECT D.ID,
STUFF
(
(
SELECT N' - '+T.Name
FROM @T T
WHERE T.ID = D.ID
FOR XML PATH(''), TYPE
).value('.','nvarchar(max)')
,1,3,N''
)
FROM @T D
GROUP BY T.ID;
7 июл 14, 11:26    [16268460]     Ответить | Цитировать Сообщить модератору
 Re: For xml path добавить разделитель  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Только вот спецсимволы XML в поле Name (если есть) всё дело испортят.
SELECT D.ID,
 STUFF
 (
  (
   SELECT N' - '+T.Name
   FROM @T T
   WHERE T.ID = D.ID
   FOR XML PATH(''), TYPE
  ).value('.','nvarchar(max)')
  ,1,3,N''
)
FROM @T D  
GROUP BY T.ID;
7 июл 14, 11:26    [16268464]     Ответить | Цитировать Сообщить модератору
 Re: For xml path добавить разделитель  [new]
Nechto
Member

Откуда:
Сообщений: 829
iap
Пробелы сбоку от дефиса нужны?
SELECT D.ID,
 STUFF
 (
  (
   SELECT ' - '+T.Name
   FROM @T T
   WHERE T.ID = D.ID
   FOR XML PATH('')
  )
  ,1,3,''
)
FROM @T D  
GROUP BY T.ID;


То что надо!!! Спасибо большое!!!
7 июл 14, 11:27    [16268469]     Ответить | Цитировать Сообщить модератору
 Re: For xml path добавить разделитель  [new]
Nechto
Member

Откуда:
Сообщений: 829
Да спец символы могут быть.

В общем воспользовался этим примером. Просто и сердито. Ещё раз спасибо!

SELECT D.ID,
 STUFF
 (
  (
   SELECT '- '+T.Name
   FROM @T T
   WHERE T.ID = D.ID
   FOR XML PATH('')
  )
  ,1,1,''
)
FROM @T D  
GROUP BY T.ID
7 июл 14, 11:31    [16268500]     Ответить | Цитировать Сообщить модератору
 Re: For xml path добавить разделитель  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Nechto
Да спец символы могут быть
Тогда нужен более сложный запрос с TYPE и value().
Он, правда, будет намного больше тормозить.
7 июл 14, 11:35    [16268527]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить