如何在SQLServer中使用FOR XML PATH删除前导空格

如何在SQLServer中使用FOR XML PATH删除前导空格,sql,sql-server,xml,tsql,string-concatenation,Sql,Sql Server,Xml,Tsql,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: D

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

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

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
Owner Me的第二行是您可以复制和粘贴的条目,以解决缩进问题。我需要添加什么来去除在字符串concat开头添加的额外空间


谢谢你

这个问题是你对CHAR13的位置。您希望在开始处而不是空格处:

选择所有者, CastStuff选择CHAR13+'所有者:'+Owner+',宠物:'+val1+',其他宠物:'+val2+',宠物2:'+CASTval3作为varchar+',其他宠物2:'+RTRIMval4 从Temp1到b 其中b.所有者=a.所有者 对于XML路径,键入.value'.'和'varchar1000',1,1,作为文本 进入第二阶段 从Temp1作为 按所有者分组 业主命令; STUFF只是删除整个XML的第一个字符,而不是在XML中创建的每个分隔项的第一个字符。这里的分隔符是CHAR13,而不是空格“”,因此请将CHAR13放在开头


使用FOR XML PATH and STUFF方法时,第一个字符始终是字符串中的分隔符。然后使用STUFF从第一项中删除这些字符。因此,如果您有一个带有SELECT的语句,其中包含“,”+U.FirstName,那么在应用STUFF之前,您就有了值“Bob、Steve、Jane、Sally”。要删除的字符是第一个分隔符;这就是东西的来源。STUFF{FOR XML PATH},1,1,获取FOR XML PATH的输出,然后用值替换位置1的1个字符。在这个例子中,它替换了“,”,使最后一个字符串“Bob,Steve,Jane,Sally”。

这个问题是您对CHAR13的放置。您希望在开始处而不是空格处:

选择所有者, CastStuff选择CHAR13+'所有者:'+Owner+',宠物:'+val1+',其他宠物:'+val2+',宠物2:'+CASTval3作为varchar+',其他宠物2:'+RTRIMval4 从Temp1到b 其中b.所有者=a.所有者 对于XML路径,键入.value'.'和'varchar1000',1,1,作为文本 进入第二阶段 从Temp1作为 按所有者分组 业主命令; STUFF只是删除整个XML的第一个字符,而不是在XML中创建的每个分隔项的第一个字符。这里的分隔符是CHAR13,而不是空格“”,因此请将CHAR13放在开头


使用FOR XML PATH and STUFF方法时,第一个字符始终是字符串中的分隔符。然后使用STUFF从第一项中删除这些字符。因此,如果您有一个带有SELECT的语句,其中包含“,”+U.FirstName,那么在应用STUFF之前,您就有了值“Bob、Steve、Jane、Sally”。要删除的字符是第一个分隔符;这就是东西的来源。STUFF{FOR XML PATH},1,1,获取FOR XML PATH的输出,然后用值替换位置1的1个字符。在本例中,它替换了“,”,使最后一个字符串“Bob,Steve,Jane,Sally”完美无瑕。

。我以前使用“”进行定界,但在找到char13解决方案后,我没有改变这一点,在每个条目之间添加新行。非常感谢完美的我以前使用“”进行定界,但在找到char13解决方案后,我没有改变这一点,在每个条目之间添加新行。非常感谢