You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL Server 2008自定义split存储过程遇&符号解析失败求助

解决自定义split_string存储过程处理含&字符串的XML解析错误

我猜你的自定义split_string存储过程应该是采用了XML节点拆分的实现思路吧?这也是很多人复刻内置函数时常用的方法,但恰恰是XML的特性导致了&字符的解析错误——因为&是XML的预定义实体字符,直接将未转义的&放入XML文档中,XML解析器会认为这是实体引用的开头,但后面没有合法的实体名称(比如&),所以就抛出了“非法名称字符”的错误。

问题根源拆解

XML中有5个预定义的特殊字符必须转义:

  • &&
  • <&lt;
  • >&gt;
  • "&quot;
  • '&apos;

你的存储过程在处理字符串时,没有对这些特殊字符做转义处理,当字符串包含&时,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,
        '&', '&amp;'),
        '<', '&lt;'),
        '>', '&gt;'),
        '"', '&quot;'),
        '''', '&apos;');

    -- 步骤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)'),
            '&amp;', '&'),
            '&lt;', '<'),
            '&gt;', '>'),
            '&quot;', '"'),
            '&apos;', '''') AS value
    FROM @xml.nodes('/root/item') t(c);
END

额外提示

如果你的环境是SQL Server 2016及以上版本,其实完全可以直接使用内置的STRING_SPLIT函数,它本身已经处理了所有特殊字符的情况,不需要自己复刻。但如果是为了兼容更低版本或者学习目的,上面的修复方案可以解决你的问题。

内容的提问来源于stack exchange,提问作者gilesrpa

火山引擎 最新活动