T-SQL 2014环境下如何实现斜杠分隔字符串的元素顺序反转
实现方案
SQL Server 2014 没有内置的字符串拆分、聚合函数,我们可以通过XML解析的方式完成需求,可直接运行以下测试代码验证效果:
DECLARE @InputStr VARCHAR(100) = '1119/2/483/11021'; DECLARE @ReversedStr VARCHAR(100); -- 拆分字符串并生成原始序号 WITH SplitItems AS ( SELECT LTRIM(RTRIM(x.node.value('.[1]', 'varchar(100)'))) AS Item, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS SortId FROM ( -- 将字符串转为可解析的XML格式 SELECT CAST('<root><item>' + REPLACE(@InputStr, '/', '</item><item>') + '</item></root>' AS XML) AS XmlContent ) AS t CROSS APPLY XmlContent.nodes('/root/item') x(node) ) -- 倒序拼接回字符串 SELECT @ReversedStr = STUFF( ( SELECT '/' + Item FROM SplitItems ORDER BY SortId DESC FOR XML PATH(''), TYPE ).value('.[1]', 'varchar(100)'), 1, 1, '' -- 移除开头多余的斜杠 ); -- 输出结果 SELECT @ReversedStr AS ReversedResult;
执行后输出结果为 11021/483/2/1119,符合需求。
如果需要反复使用该逻辑,可以封装为标量函数:
CREATE FUNCTION dbo.ReverseDelimitedStr ( @Input VARCHAR(MAX), @Delimiter CHAR(1) ) RETURNS VARCHAR(MAX) AS BEGIN DECLARE @Result VARCHAR(MAX); WITH SplitItems AS ( SELECT LTRIM(RTRIM(x.node.value('.[1]', 'varchar(MAX)'))) AS Item, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS SortId FROM ( SELECT CAST('<root><item>' + REPLACE(@Input, @Delimiter, '</item><item>') + '</item></root>' AS XML) AS XmlContent ) AS t CROSS APPLY XmlContent.nodes('/root/item') x(node) ) SELECT @Result = STUFF( ( SELECT @Delimiter + Item FROM SplitItems ORDER BY SortId DESC FOR XML PATH(''), TYPE ).value('.[1]', 'varchar(MAX)'), 1, 1, '' ); RETURN @Result; END GO
调用示例:
SELECT dbo.ReverseDelimitedStr('1119/2/483/11021', '/')
注意事项
如果输入字符串包含<、>、&这类XML特殊字符,需要先对字符做转义处理,常规纯数字、普通字母场景下可直接使用。
内容的提问来源于stack exchange,提问作者elhassan ahmed
相关产品推荐
相关产品推荐

