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

标签 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: 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

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

谢谢

最佳答案

这个问题是您对 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 PATHSTUFF 方法时,第一个字符始终是字符串中的分隔符。然后使用 STUFF 从第一项中删除这些字符。所以,如果你有一个带有 ',' + U.FirstNameSELECT 语句,在应用 STUFF 之前你有值 ',Bob,Steve,Jane,Sally'。你要去掉的字符是第一个分隔符;这就是 STUFF 的用武之地。STUFF({FOR XML PATH},1,1,'')FOR XML PATH 获取输出, 然后用值 '' 替换从位置 1 开始的 1 个字符。在这个例子中,它替换了 ',',使最终字符串成为 'Bob,Steve,Jane,Sally'

关于sql - 如何在 SQL Server 中使用 FOR XML PATH 删除前导空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55260469/

相关文章:

javascript - 无法让我的 Javascript 函数在 PHP foreach 循环中运行多次

mysql - 如何比较两个表并显示每个差异

c# - SQL UPDATE 不起作用并且没有抛出错误

android - Android Studio 查看 XML 布局时出错

php - º,又名阳性序数指示符,破坏 PHP 中的 XML 节点创建

sql - 选择id为偶数的行

在同一个表中使用 SUM 的 MySql UPDATE

sql - 如何处理postgresql函数中的单引号

sql-server - 写SqlTableData : The given value of type String from the data source cannot be converted to type bit of the specified target column

xml - 将 Excel 的 SUM() 添加到 XLST 结果页?