Как удалить ведущий пробел, используя FOR XML PATH в SQL Server - PullRequest
1 голос
/ 20 марта 2019

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

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

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-я строка для владельца "Я" будет записью, которую можно скопировать и вставить для устранения проблем с отступом. Что мне нужно добавить, чтобы убрать лишнее пространство, добавленное в начале моего конкатата строки?

Спасибо

1 Ответ

5 голосов
/ 20 марта 2019

Эта проблема - ваше размещение 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 с ',' + U.FirstName, перед применением STUFF у вас будет значение ',Bob,Steve,Jane,Sally'.Персонаж, от которого вы хотите избавиться, является первым разделителем;вот где приходит STUFF. STUFF({FOR XML PATH},1,1,'') берет вывод из FOR XML PATH, а затем заменяет 1 символ из позиции 1 значением ''.В этом примере он заменяет ',', делая последнюю строку 'Bob,Steve,Jane,Sally'.

...