#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) для добавления новой строки между каждой записью. Большое вам спасибо ! 🙂