Как удалить начальный пробел, используя ДЛЯ XML-ПУТИ в SQL Server

#sql #sql-server #xml #tsql #string-concatenation

#sql #sql-сервер #xml #tsql #строка-конкатенация

Вопрос:

Я пытаюсь объединить некоторые данные в строку, и у меня возникает проблема. Эти данные будут использоваться для слияния почты.

После того, как я объединяю свои данные в один столбец, а затем копирую их в электронное письмо с помощью слияния, результат выглядит следующим образом

 Owner: Me, Pet: Dog, Other Pet: Cat, Pet2: Dog2, OtherPet2: Cat2
 Owner: Me, Pet: Dog, Other Pet: Cat, Pet2: Dog2, OtherPet2: Cat2
 Owner: Me, Pet: Dog, Other Pet: Cat, Pet2: Dog2, OtherPet2: Cat2
 Owner: Me, Pet: Dog, Other Pet: Cat, Pet2: Dog2, OtherPet2: Cat2
  

Я хочу, чтобы каждая строка имела одинаковый отступ, но в настоящее время я не могу добиться этого, пытаясь выполнить ряд действий.

Мой воспроизводимый код здесь:

 DROP TABLE #Temp1
DROP TABLE #temp2
CREATE TABLE #Temp1 (Owner varchar(10), val1 varchar(10), val2 varchar(10), val3 varchar(10), val4 varchar(10))

INSERT INTO #Temp1 values('Me','Dog','Cat', 'Dog2', 'Cat2')
INSERT INTO #Temp1 values('You','Dog','Cat', 'Dog2', 'Cat2')
INSERT INTO #Temp1 values('He','Dog','Cat', 'Dog2', 'Cat2')
INSERT INTO #Temp1 values('She','Dog','Cat', 'Dog2', 'Cat2')
INSERT INTO #Temp1 values('Me','Dog','Cat', 'Dog2', 'Cat2')
INSERT INTO #Temp1 values('Me','Dog','Cat', 'Dog2', 'Cat2')
INSERT INTO #Temp1 values('Me','Dog','Cat', 'Dog2', 'Cat2')



SELECT Owner, 
Pets = 
cast(STUFF 
( 
( 
SELECT  (' '  'Owner: '   Owner    ', Pet: '   val1   ', Other Pet: '   val2   ', Pet2: '   cast(val3 as varchar)  ', OtherPet2: '   RTRIM(val4)   char(13))
FROM #Temp1  as b 
WHERE b.Owner=a.Owner 
FOR XML PATH(''),TYPE 
).value('.', 'varchar(1000)'), 1, 1, '') as text) 
INTO #Temp2

FROM #Temp1 as a 

GROUP BY Owner
Order by Owner 


SELECT * FROM #Temp2
  

2-я строка для владельца «Me» будет записью, которую вы можете скопировать и вставить для устранения неполадок с отступом. Что мне нужно добавить, чтобы удалить этот дополнительный пробел, добавленный в начале моего объединения строк?

Спасибо

Ответ №1:

Эта проблема заключается в вашем размещении CHAR(13) . Вы хотите, чтобы это было в начале вместо пробела:

 SELECT Owner,
       CAST(STUFF((SELECT (CHAR(13)   'Owner: '   Owner   ', Pet: '   val1   ', Other Pet: '   val2   ', Pet2: '   CAST(val3 AS varchar)   ', OtherPet2: '   RTRIM(val4) )
                   FROM #Temp1 AS b
                   WHERE b.Owner = a.Owner
                  FOR XML PATH(''), TYPE).value('.', 'varchar(1000)'),1,1,'') AS text) AS Pets
INTO #Temp2
FROM #Temp1 AS a
GROUP BY Owner
ORDER BY Owner;
  

STUFF удаляет только первый символ всего XML, а не первый символ каждого элемента с разделителями, созданного в XML. CHAR(13) здесь ваш разделитель, а не пробел ( ' ' ), поэтому вместо этого поместите CHAR(13) в начале.

При использовании метода FOR XML PATH и STUFF первые символы всегда являются вашими разделителями в строке. Затем вы используете STUFF для удаления этих символов из первого элемента. Итак, если у вас есть оператор с SELECT with ',' U.FirstName , перед STUFF применением у вас есть значение ',Bob,Steve,Jane,Sally' . Символ, от которого вы хотите избавиться, является первым разделителем; вот где STUFF появляется. STUFF({FOR XML PATH},1,1,'') извлекает выходные данные из FOR XML PATH , а затем заменяет 1 символ из позиции 1 на значение '' . В этом примере он заменяет ',' , создавая конечную строку 'Bob,Steve,Jane,Sally' .

Комментарии:

1. Идеальный. Я использовал ‘ ‘ для разграничения ранее и не изменил это после того, как нашел решение char (13) для добавления новой строки между каждой записью. Большое вам спасибо ! 🙂