在TSQL中生成CRLF以供SSRS接受

时间:2018-06-19 07:10:57

标签: tsql reporting-services encoding newline xml-entities

在TSQL中,我将不同的行连接到一个单元格:FOR xml path('') 我在每一行后面放置下一个字符以生成换行符。 + char(13)+ char(10) SSRS确实会生成换行符,但也会打印这些CRLF字符。 每一行以:
结尾 有解决方案吗?

1 个答案:

答案 0 :(得分:1)

使用简单FOR XML PATH('')生成的XML(为了执行STRING_AGG()之类的操作)会将任何禁用字符(例如<, > and &等等)转换为对应实体。实体是&abc;,而abc代表一个字符(如&lt;),或者您看到某种十六进制或unicode代码点。这是在创建XML隐含时完成的。从这个XML中读取一些东西会再次隐式地进行反转过程。

但是:您的代码不会将结果作为原生XML类型返回

试试这个(最好将输出切换为“text”):

SELECT TOP 5 o.[name] + CHAR(13) + CHAR(10)
FROM sys.objects o
FOR XML PATH('')

返回

sysrscols&#x0D;
sysrowsets&#x0D;
sysclones&#x0D;
sysallocunits&#x0D;
sysfiles1&#x0D;

但是如果您将XML作为类型结果处理,则可以使用.value()

SELECT
(
    SELECT TOP 5 o.[name] + CHAR(13) + CHAR(10)
    FROM sys.objects o
    FOR XML PATH(''),TYPE
).value('.','nvarchar(max)');

返回

sysrscols
sysrowsets
sysclones
sysallocunits
sysfiles1

你没有显示任何代码,但我认为你有类似的东西

SELECT  SomeColumn
      ,(SELECT blah + CHAR(13) + CHAR(10) 
        FROM SomeInnerTable 
        WHERE SomeCondition 
        FOR XML PATH('')) AS SomeAlias
FROM SomeOuterTable;

将此更改为

SELECT  SomeColumn
      ,(SELECT blah + CHAR(13) + CHAR(10) 
        FROM SomeInnerTable 
        WHERE SomeCondition 
        FOR XML PATH(''),TYPE).value('.','nvarchar(max)') AS SomeAlias
FROM SomeOuterTable;