2013-05-14 97 views
21

我在SQL Server中较大的Select语句中下面的查询:SQL“东西”和“FOR XML PATH”产生奇怪的符号

CONVERT(NVARCHAR(2000),stuff((SELECT '; ' + IsNull(D2.SelectedComments,'') 
FROM #StudentDetails D2 
WHERE D2.STUD_PK = A.STUD_PK AND D2.CourseNo = A.CourseNo 
AND D2.Section = A.Section 
FOR XML PATH('')),1,2,'')) AS SelectedComments, 

此列某些条目如This approach is satisfactory .&#x0D后产生一些奇怪的符号。我不明白.&#x0D是从哪里来的。在此之前我尝试了SELECT SelectedComments FROM #StudentDetails,我没有看到.&#x0D。任何人都可以告诉它可能来自哪里?

+0

0D是回车的HEX:http://www.columbia.edu/kermit/ascii。 html – valverij 2013-05-14 15:31:54

+0

我认为这是换行和回车。当您将FOR XML PATH()添加到您的Select语句中时,某些不友好的XML字符将被编码,包括换行符和回车符。据我所知,SQL将输出有效的XML与正确的编码 – Rodders 2013-05-14 15:33:28

回答

39

如果修改了对XML路径您的使用,它会为你做的转义,你会不会需要诉诸使用替换功能:

, Stuff(
     (
     Select '; ' + IsNull(D2.SelectedComments, '') 
     From #StudentDetails As D2 
     Where D2.Stud_PK = A.Stud_PK 
      And D2.CourseNo = A.CourseNo 
      And D2.Section = A.Section 
     For Xml Path(''), type 
     ).value('.', 'nvarchar(max)') 
     , 1, 2, '') As SelectedComments 
+0

所以..默认情况下,“For XML”返回一个XML数据类型,与转义的空格字符。有意义,甚至更清楚你想要的数据类型。 – Davos 2014-09-22 08:13:25

2

&#x0D是回车符。您可以插入之前清理数据,删除它,或者,如果你想保留原来的格式,加上TYPE您选择的结尾:

SELECT * FROM MyData FOR XML PATH(''), TYPE