这比你写的代码要短得多:
简短的解释:通过将, 替换为</x><x>,我们只需在前面添加一个<x>,在末尾添加一个</x> - 瞧! - 我们有 XML。
XML 易于索引。您必须使用 XQuery 函数 sql:variable() 将变量索引放入 XPath。
DECLARE @string VARCHAR(MAX)='ABC,DEF,GHI';
DECLARE @index INT=2;
WITH AsXML AS
(
SELECT CAST('<x>' + REPLACE(@string,',','</x><x>') + '</x>' AS XML) AS Splitted
)
SELECT Splitted.value('/x[sql:variable("@index")][1]','varchar(max)')
FROM AsXML
编辑:在这里,您可以找到一个使用这种方法作为函数的完整工作示例。
CREATE FUNCTION dbo.Tokenizer
(
@string VARCHAR(MAX)
,@index INT
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @RetVal VARCHAR(MAX);
WITH AsXML AS
(
SELECT CAST('<x>' + REPLACE(@string,',','</x><x>') + '</x>' AS XML) AS Splitted
)
SELECT @RetVal = Splitted.value('/x[sql:variable("@index")][1]','varchar(max)')
FROM AsXML;
RETURN @RetVal;
END
GO
SELECT dbo.Tokenizer( 'ABC,DEF,GHI',2); --Returns "DEF"
GO
--Clean up
DROP FUNCTION dbo.Tokenizer;