SQL Server 2008自定义split存储过程遇&符号解析失败求助
解决自定义split_string存储过程处理含&字符串的XML解析错误
我猜你的自定义split_string存储过程应该是采用了XML节点拆分的实现思路吧?这也是很多人复刻内置函数时常用的方法,但恰恰是XML的特性导致了&字符的解析错误——因为&是XML的预定义实体字符,直接将未转义的&放入XML文档中,XML解析器会认为这是实体引用的开头,但后面没有合法的实体名称(比如&),所以就抛出了“非法名称字符”的错误。
问题根源拆解
XML中有5个预定义的特殊字符必须转义:
&→&<→<>→>"→"'→'
你的存储过程在处理字符串时,没有对这些特殊字符做转义处理,当字符串包含&时,XML解析器无法识别,直接报错。
修复方案:转义后拆分,拆分后还原
我们需要在生成XML之前,先把字符串中的特殊字符转义,拆分完成后再将转义后的字符还原回去。下面是修改后的存储过程示例:
CREATE PROCEDURE dbo.split_string @input NVARCHAR(MAX), @delimiter NVARCHAR(10) AS BEGIN SET NOCOUNT ON; -- 步骤1:转义XML特殊字符 DECLARE @escaped_input NVARCHAR(MAX) = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @input, '&', '&'), '<', '<'), '>', '>'), '"', '"'), '''', '''); -- 步骤2:生成XML并拆分 DECLARE @xml XML = N'<root><item>' + REPLACE(@escaped_input, @delimiter, N'</item><item>') + N'</item></root>'; -- 步骤3:提取拆分结果并还原特殊字符 SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( t.c.value('.', 'NVARCHAR(MAX)'), '&', '&'), '<', '<'), '>', '>'), '"', '"'), ''', '''') AS value FROM @xml.nodes('/root/item') t(c); END
额外提示
如果你的环境是SQL Server 2016及以上版本,其实完全可以直接使用内置的STRING_SPLIT函数,它本身已经处理了所有特殊字符的情况,不需要自己复刻。但如果是为了兼容更低版本或者学习目的,上面的修复方案可以解决你的问题。
内容的提问来源于stack exchange,提问作者gilesrpa




