我正在尝试对一些数据进行字符串聚合,但遇到了问题。此数据将用于邮件合并。
在我将数据聚合到一个列中,然后通过邮件合并将其复制到电子邮件中后,结果如下所示
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 PATH
和 STUFF
方法时,第一个字符始终是字符串中的分隔符。然后使用 STUFF
从第一项中删除这些字符。所以,如果你有一个带有 ',' + U.FirstName
的 SELECT
语句,在应用 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/