在FOR XML SELECT中使用CHAR(13)

时间:2016-09-12 18:25:33

标签: sql sql-server-2008 tsql for-xml

我正在尝试使用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

7 个答案:

答案 0 :(得分:3)

感谢大家的帮助。

此处的最终目标是将Excel中的数据作为报告的一部分呈现。我确信有更优雅的方式来做到这一点,但我至少得到了我想要的结果:

REPLACE (
    REPLACE(
        REPLACE(
            (SELECT Comment FROM CallNotes WHERE ForeignId = a.ForeignId FOR XML PATH (''))
        , '<Comment>', '')  
    , '</Comment>', CHAR(13) + CHAR(10))
, '&#x0D;', '') 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摆脱了这个:

&#x0D;  

(我仍然不明白它来自哪里。)

因此,当结果发送到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&#x0D;line 2&#x0D;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;或&#x0D;。你试图替换它只是一个简短的角色。但无论如何:你不应该这样做!

试试吧:

SELECT CAST('<x>&#x48;&#x65;&#x6c;&#x6c;&#x6f;</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,''),' ','')


对不起,如果我不清楚,这是我的第一篇文章。