如何在SQL Server中使用FOR XML PATH删除前导空间

Col*_*in9 1 xml sql t-sql sql-server string-concatenation

我正在尝试对一些数据进行字符串汇总,并遇到了问题。此数据将用于邮件合并。

在将数据聚合到单个列中,然后通过邮件合并将其复制到电子邮件中之后,结果看起来像

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
Run Code Online (Sandbox Code Playgroud)

我希望每一行都有相同的缩进,但是我目前无法通过尝试许多操作来实现。

我的可复制代码在这里:

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
Run Code Online (Sandbox Code Playgroud)

所有者“我”的第二行是您可以复制并粘贴以解决缩进问题的条目。我需要添加什么来去除在字符串concat开头添加的额外空间?

谢谢

Lar*_*rnu 5

这个问题是您放置的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;
Run Code Online (Sandbox Code Playgroud)

STUFF仅去除所述第一的XML,而不是XML内创建的每个分隔的项目的第一个字符的全部的字符。CHAR(13)是您的定界符,而不是空格(' '),因此请放在CHAR(13)开头。

使用FOR XML PATHand STUFF方法时,第一个字符始终是字符串中的定界符。然后,您用于STUFF从第一项中删除那些字符。因此,如果您有一个带有SELECTwith 的语句',' + U.FirstName,那么在STUFF应用之前,您将拥有value ',Bob,Steve,Jane,Sally'。您要删除的字符是第一个分隔符;这是STUFF进来的。STUFF({FOR XML PATH},1,1,'')从中获取输出FOR XML PATH,然后将值1中的1个字符替换为''。在此示例中,它将替换','为最终字符串'Bob,Steve,Jane,Sally'