问题 使用XML PATH时的额外字符


我有一个名为Map_Data的表,数据如下:

 ID    SoCol                                                              Descol  
 125   case Per_rating when 5 then 'Good' when 4 then 'Ok' else null end  D_Code

我在这个特定的行上写了一个查询,查询是:

SELECT  Params = ( SELECT   DesCol + ' = ''' + SoCol + ''''
                   FROM     dbo.Map_Data  t1
                   WHERE   ID = 125
                   FOR
                   XML PATH('')
                 )

我得到的输出为:

D_Code = 'case per_rating
 when 5 then 'Good'
 when 4
 then 'Ok'
 end'

任何人都可以告诉我为什么我会得到 '
' 它,我该如何纠正它?


3311
2018-02-16 16:07


起源

检查Mapdata的内容,我认为其中有#13(回车)。它们可能在您用于显示表格内容的任何内容中都不可见。鉴于它们在哪里看起来SoCol被美化了。 - Tony Hopkinson


答案:


这个微小的变化将使丑陋的实体消失,但它们不会消除回车(查看结果到文本的结果,而不是结果到网格,看看它们):

SELECT  Params = ( SELECT   DesCol + ' = ''' + SoCol + ''''
                   FROM     dbo.Map_Data  t1
                   WHERE   ID = 125
                   FOR
                   XML PATH(''), TYPE
                 ).value('.[1]', 'nvarchar(max)');

如果你想摆脱CR / LF也可以说:

SELECT  Params = ( SELECT   REPLACE(REPLACE(DesCol + ' = ''' + SoCol + '''', 
     CHAR(13), ''), CHAR(10), '')
                   FROM     dbo.Map_Data  t1
                   WHERE   ID = 125
                   FOR
                   XML PATH(''), TYPE
                 ).value('.[1]', 'nvarchar(max)');

此外,我不确定你将如何使用输出,但如果你稍后将使用动态SQL评估它,你将需要替换嵌入的单引号(')有两个单引号('')。否则它会爆炸,因为它们也是字符串分隔符。


15
2018-02-16 16:35



非常感谢!!! - peter
请注意使用 .value 比使用没有慢得多。我有一个充满了这样的调用的UDF,它引起了相当多的性能损失。 - Sebazzz
@Sebazz太棒了。你能说明如何在不使用的情况下获得相同的输出 .value? - Aaron Bertrand
你不能。这是缺点。如果可能,您可以过滤应用程序代码中的值。在许多情况下,这可以很好地工作,但是在Params列上的一些查询可能无法正常工作,因为转义的XML将位于中间。 - Sebazzz
@Sebazz确定如果用户希望数据库返回所需的输出,那么他们就无法使用您的方法。得到它了。 - Aaron Bertrand


您还可以通过将单引号中的所有代码保存在一行中来实现此目的。我也有类似的问题,它通过将所有代码保持在一行来解决。


0
2018-04-01 18:59