【问题标题】:SQL Server - Storing linebreaks in XML data typeSQL Server - 以 XML 数据类型存储换行符
【发布时间】:2009-10-05 19:44:46
【问题描述】:

是否可以在 XML 数据类型中存储非字母数字字符(更具体地说是换行符)?

下面的代码说明了我的问题:

declare @a xml
declare @b nvarchar(max)

set @b = '<Entry Attrib="1'+CHAR(13)+'2" />'

print @b

set @a=convert(xml,@b,1)

set @b=convert(nvarchar, @a,1)

print @b

输出是:

<Entry Attrib="1
2" />
<Entry Attrib="1 2"/>

有什么办法可以保持换行符不变?

我的实际问题是将值存储在表中(而不是局部变量),所以也许我的表中对应的 XML 列有一些设置可以完成这项工作?

【问题讨论】:

    标签: sql sql-server xml sql-server-2005 tsql


    【解决方案1】:

    这是不可能的。 XML 数据类型存储为 XML DOM 树,而不是字符串。

    如果您想保留空格,则必须将其存储为 varchar。

    【讨论】:

    • 你能给我指出一些关于这个的微软官方文档吗?
    【解决方案2】:

    我的answer in the XSLT context 应该在这里申请:

    XML 解析的实体通常存储在 在用于编辑的计算机文件中 方便,被组织成行。 这些行通常由 一些字符的组合 回车 (#xD) 和换行 (#xA)。

    所以这可能是您正在寻找的:

    set @b = '<Entry Attrib="1&#xA;2" />'
    

    【讨论】:

    • 我正在使用 SQL Server 2005,我得到以下输出:
    【解决方案3】:

    根据 XML 规范,XML 标记内的空白不重要,不会被保留。然而,元素外的空白区域会:

    declare @a xml
    declare @b nvarchar(max)
    
    set @b = '<Entry Attrib="12"> fo'+CHAR(13)+'o</Entry>'
    print @b
    set @a=convert(xml,@b,1)
    set @b=convert(nvarchar(max), @a,1)
    print @b
    

    将输出:

    <Entry Attrib="12"> fo
    o</Entry>
    <Entry Attrib="12"> fo
    o</Entry>
    

    【讨论】:

    • 第二个“convert”出现以下错误:Msg 6354, Level 16, State 10, Line 13 目标字符串太小,无法表示 XML 实例
    • 我也是第一次通过。 SQL Server 将 nvarchar 存储为每个输入字符的 2 个字节 + 2 个字节。您的脚本将 @b 的存储设置为 46 字节(2*22 个字符 + 2),而我的脚本将存储设置为 66 个字节(2*32 个字符 + 2)。似乎优化器会将初始分配存储分配保留在查询计划中,因此您需要使用不同的变量名称,在新的查询窗口中运行我的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多