只需创建一个拆分函数,例如(更新以处理尾随;
,问题中未列出的场景):
CREATE FUNCTION dbo.SplitStrings_XML
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item FROM
(
SELECT Item = RTRIM(y.i.value('.[1]', 'nvarchar(4000)'))
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
) AS x WHERE LEN(Item) > 0
);
GO
然后你可以说以下任何一个:
--DECLARE TCursor LOCAL FAST_FORWARD FOR
SELECT Item FROM dbo.SplitStrings_XML('hello;my;apple;world;is;good', ';');
SELECT Item FROM dbo.SplitStrings_XML('hello;my;apple;world;is;good;', ';');
SELECT Item FROM dbo.SplitStrings_XML('apple;', ';');
我的猜测是,您实际上并不需要光标,但在不知道您在循环内做什么的情况下很难提供指导。
顺便说一句,虽然这个 XML 函数作为一个独立的答案可以很好地工作,但还有更好、更具可扩展性的解决方案需要更多的努力。