0

我正在尝试使用以下代码更新表中的项目:

UPDATE My_Table SET My_Xml = CONVERT(XML, '<xml>MY_SUPER_LONG_XML_STRING</xml>') WHERE id = '001'; 

我拥有的 XML 字符串大约有 100 行长。我知道这种方式CONVERT()将删除所有回车和换行符。因此,如果我将 STYLE 设置CONVERT()为“1”,这将保留所有空白。下面的代码非常适合我:

UPDATE My_Table SET My_Xml = CONVERT(XML, '<xml>MY_SUPER_LONG_XML_STRING</xml>', 1) WHERE id = '001'; 

问题是这将通过其他一些系统,我必须使用 ascii 字符来替换回车符和换行符,所以我将其更改为:

UPDATE My_Table SET My_Xml = CONVERT(XML, 
'<xml>'+Char(13)+Char(10)+
'MY_SUPER_LONG_XML_STRING_LINE1'+Char(13)+Char(10)+
'MY_SUPER_LONG_XML_STRING_LINE2'+Char(13)+Char(10)+
...
'</xml>') WHERE id = '001'; 

这仅适用于 XML 输入字符串大约 30 行长的情况。当我使用原始字符串时,出现错误:

Msg 9400, Level 16, State 1, Line 5
XML parsing: line 28, character 126, unexpected end of input

这似乎输入字符串被切断了。我的意思是几百行 xml 仍然不长,因为 sql 中 xml 的限制是 2 GB。我将 STYLE 标志设置为 1 的方式也适用于任何长度的 xml。所以理想情况下用 Char(13)+Char(10) 替换 "\r\n" 应该也可以,对吧?知道为什么会这样吗?

更新:刚刚发现问题所在。sql server 中的字符串连接似乎有限制。仍然不确定如何解决它

4

1 回答 1

1

SQL Server 在内部将 XML 数据类型存储为 UTF-16 二进制格式。它不是带有任意换行符和回车符的字符串。

当 XML 持久保存在文件系统上时,它可以是一个流,也可以是人眼的缩进。但在这两种情况下,它仍然是合法的 XML。

“......问题是这将通过其他一些系统,我必须使用 ascii 字符来替换回车和换行......”。

我猜其他系统在处理 XML 时存在一些实际问题。

我会改变你的SQL如下:

DECLARE @xml XML = N'<xml>MY_SUPER_LONG_XML_STRING</xml>';

UPDATE My_Table 
SET My_Xml = @xml 
WHERE id = '001';
于 2020-04-30T18:47:29.237 回答