本当に TSQL で実行したい場合は、以下を参照してください。
私は SQL Fiddle をゲームして、それが機能していることを示しました。フィドルの CROSS JOIN を無視します。それらは、DECLARE に対する SQLFiddle の制限を回避するだけです。
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];