如何在 SQL 服务器中使用 FOR XML PATH 删除前导 space

How to remove leading space using FOR XML PATH in SQL Server

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

在我将数据聚合到一个列中,然后通过邮件合并将其复制到电子邮件中后,结果如下所示

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

所有者 "Me" 的第 2 行是您可以复制和粘贴以解决缩进问题的条目。我需要添加什么来去除在我的字符串连接开头添加的额外 space?

谢谢

这个问题是您对 CHAR(13) 的放置。您希望在开头而不是 space:

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 的 first 字符,而不是 [=] 中创建的每个分隔项的第一个字符38=]。 CHAR(13) 是这里的分隔符,不是白色的 space (' '),因此请将 CHAR(13) 放在开头。

使用 FOR XML PATHSTUFF 方法时,第一个字符始终是字符串中的分隔符。然后使用 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'.