如果您真的想在 TSQL 中执行此操作,请参见下文。
我已经玩弄了 SQL Fiddle 来展示它的工作原理,忽略小提琴中的 CROSS JOIN,他们只是绕过了 SQLFiddle 对 DECLARE 的限制。
DECLARE @s varchar(8000);
DECLARE @sep char;
SET @s = 'MYTEST\aftercompare\slash2\slash3\slash4';
SET @sep = '\';
WITH [splits] AS (
SELECT
0 [index],
CHARINDEX(@sep, @s) [pos],
0 [lastPos]
UNION ALL
SELECT
[index] + 1,
CHARINDEX(@sep, @s, [pos] + 1),
[pos]
FROM [splits]
WHERE
[pos] > 0)
SELECT
[index],
SUBSTRING(
@s,
[lastPos] + 1,
CASE WHEN [pos] = 0
THEN 8000
ELSE [pos] - [lastPos] - 1
END) [value]
FROM [splits];
给出结果
INDEX VALUE
0 MYTEST
1 aftercompare
2 slash2
3 slash3
4 slash4
在我无法使用表值参数的 SQL 2005 数据库中,我创建了 .Net CLRSplit
来组成正常的 .NetSplit
函数。使用正确的工具,字符串操作更简单、更快捷。
如果需要,这里有一个NVarChar(MAX)
版本。
DECLARE @s nvarchar(max);
DECLARE @sep nchar;
SET @s = N'MYTEST\aftercompare\slash2\slash3\slash4';
SET @sep = N'\';
WITH [splits] AS (
SELECT
CAST(0 AS bigint) [index],
CHARINDEX(@sep, @s) [pos],
CAST(0 AS bigint) [lastPos]
UNION ALL
SELECT
[index] + 1,
CHARINDEX(@sep, @s, [pos] + 1),
[pos]
FROM [splits]
WHERE
[pos] > 0)
SELECT
[index],
SUBSTRING(
@s,
[lastPos] + 1,
CASE WHEN [pos] = 0
THEN 2147483647
ELSE [pos] - [lastPos] - 1
END) value
FROM [splits];