一尘不染

SQL Server 使用 XML 拆分 - 非法名称字符

sql

我正在使用以下内容将逗号分隔的字符串溢出到列中(SQL Server 2014):

function [dbo].[splitString](@input Varchar(max), @Splitter Varchar(99)) returns table as
Return
    SELECT Split.a.value('.', 'NVARCHAR(max)') AS Data FROM
    ( SELECT CAST ('<M>' + REPLACE(@input, @Splitter, '</M><M>') + '</M>' AS XML) AS Data 
    ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);

当我尝试拆分以下内容时:

Front Office,Food & Beverage,Housekeeping,Human Resource & Training,Reservation,Other

我收到以下错误:XML 解析:第 1 行,字符 82,非法名称字符

有没有办法在我的函数中包含特殊字符?


阅读 103

收藏
2022-07-22

共1个答案

一尘不染

请尝试以下解决方案。

值得注意的点:

  • CData部分保护 XML 实体,如 & 符号等。
  • text()inside.nodes()方法是出于性能原因。
  • TRY_CAST()将返回 NULL,但不会出错。

SQL

DECLARE @input Varchar(max) = 'Front Office,Food & Beverage,Housekeeping,Human Resource & Training,Reservation,Other'
    , @Splitter Varchar(99) = ',';

SELECT Split.a.value('.', 'NVARCHAR(max)') AS Data 
FROM ( SELECT TRY_CAST('<M><![CDATA[' + REPLACE(@input, @Splitter, ']]></M><M><![CDATA[') + ']]></M>' AS XML) AS Data 
    ) AS A CROSS APPLY Data.nodes ('/M/text()') AS Split(a);
2022-07-22