我正在尝试使用CHAR(13)强制换行,但问题是,我在FOR XML Select语句中这样做:
SELECT
STUFF((SELECT CHAR(13) + Comment
FROM
myTable
FOR XML PATH ('')) , 1, 1, '')
问题在于,我没有获得实际的新行。相反,我得到:
#x0D;
所以数据字面意思如下:
#x0D;First Line of Data#x0D;Second Line of Data#x0D;Etc
所以我试着替换#x0D;在FOR XML之外使用CHAR(13):
REPLACE(SELECT
STUFF((SELECT CHAR(13) + Comment
FROM
myTable
FOR XML PATH ('')) , 1, 1, '')), '#x0D;', CHAR(13))
这让我很接近。它可以添加换行符,但它还包括一个&在每一行的末尾,以及第一行之后的每一行的开头:
First Line of Data&
&Second Line of Data&
&Etc
答案 0 :(得分:3)
感谢大家的帮助。
此处的最终目标是将Excel中的数据作为报告的一部分呈现。我确信有更优雅的方式来做到这一点,但我至少得到了我想要的结果:
REPLACE (
REPLACE(
REPLACE(
(SELECT Comment FROM CallNotes WHERE ForeignId = a.ForeignId FOR XML PATH (''))
, '<Comment>', '')
, '</Comment>', CHAR(13) + CHAR(10))
, '
', '') AS Comments
select语句本身就像我们期望的那样返回XML:
<comment>This is a comment</comment><comment>This is another comment</comment>
最里面的REPLACE只是摆脱了开头的标签:
<comment>
中间REPLACE删除结束标记:
</comment>
并用CHAR(13)+ CHAR(10)替换它。最外面的REPLACE摆脱了这个:

(我仍然不明白它来自哪里。)
因此,当结果发送到Excel时,它在单元格中看起来像这样:
This is a comment.
This is another comment.
这正是我想要的。同样,我确信有更好的解决方案。但这至少目前是有效的。
答案 1 :(得分:2)
我认为这更清洁。基本上从换行符(或其他一些特殊字符)开始,然后根据需要用回车符和换行符替换它们。
Select REPLACE(STUFF((SELECT CHAR(10) + Comment
FROM myTable FOR XML PATH ('')) , 1, 1, ''),
CHAR(10), CHAR(13)+CHAR(10))
答案 2 :(得分:1)
我想,因为你需要对FK进行分组,你可以使用这样的东西......只需将#TempT替换为你的表......
Select Pri.ForeignKey,
Replace(Left(Pri.Notes,Len(Pri.Notes)-1),',',CHAR(13)) As Notes
From
(
Select distinct T2.ForeignKey,
(
Select T1.Note + ',' AS [text()]
From #TempT T1
Where T1.ForeignKey = T2.ForeignKey
ORDER BY T1.ForeignKey
For XML PATH ('')
) Notes
From #TempT T2
) Pri
同样在评论中列出的OP中,您有一个重复的PrimaryKey。我发现这很奇怪。只是一个抬头。
答案 3 :(得分:1)
您的方法不是真正的XML :
尝试使用&#34;输出到文本&#34;:
DECLARE @tbl TABLE(TestText VARCHAR(100));
INSERT INTO @tbl VALUES('line 1'),('line 2'),('line 3');
SELECT STUFF
(
(
SELECT CHAR(10) + tbl.TestText
FROM @tbl AS tbl
FOR XML PATH('')
),1,1,''
)
使用CHAR(13)
#x0D;line 1
line 2
line 3
看到你的STUFF
刚拿走&符号?
使用CHAR(10)
line 1
line 2
line 3
但你真正需要的是:
SELECT STUFF
(
(
SELECT CHAR(10) + tbl.TestText --you might use 13 and 10 here
FROM @tbl AS tbl
FOR XML PATH(''),TYPE
).value('.','nvarchar(max)'),1,1,''
)
,TYPE
将返回真实XML ,而.value()
则会正确阅读。
你误解了&#34;所以数据看起来像这样&#34;
它不是&#34;看起来像这样&#34; ,它被转义以适应 XML中的规则。当你正确阅读它时,它会被隐式地反编码。
你对换行符有误解:
在(几乎)远古时代,您需要CR = Carriage Return, 13 or x0D
移回打印雪橇,另外您需要LF = Line Feed, 10 or x0A
来转动压板来移动纸张。因此,广泛使用的需要使用两个字符(13/10或0D / 0A)编码换行符。
今天,ASCII 10(0A)经常被看到......
但回到你的实际问题:你为什么要担心数据的外观?在XML中,某些字符串可能看起来很难看,但是 - 如果你正确阅读 - 解码回到原始外观是隐式完成的......
您的残留不超过编码的一部分,因为它以&符号开头,以分号结尾:&lg
;或
。你试图替换它只是一个简短的角色。但无论如何:你不应该这样做!
试试吧:
SELECT CAST('<x>Hello</x>' AS XML).value('/x[1]','nvarchar(max)')
答案 4 :(得分:0)
如果您使用以下查询和结果到文本选项,您将看到换行符。使用结果网格功能无法显示换行符。
SELECT
STUFF((SELECT CHAR(10) + Comment
FROM
myTable
FOR XML PATH ('')) , 1, 1, '')
答案 5 :(得分:0)
我建议评论+字符(10)+字符(13)
“回车”“换行”应该在该行的末尾。
答案 6 :(得分:0)
我相信这会有所帮助,
REPLACE(STUFF((SELECT CHAR(13)+ CHAR(10)+ Field1 + Field2 从 ((表 哪里 field3 ='condition1' FOR XML PATH('')),1,0,''),' ','')
对不起,如果我不清楚,这是我的第一篇文章。