100行を返す選択があります。一部の行の列の 1 つで、通常のvarchar(2)
値が得られます。しかし、いくつかの行では、このような文字列を取得します1}33}47}48}50}86}98}UC}AL}MH}88
}
上記の関数を区切り記号の後に分割し、行として返したいと思います。
誰でもこれで私を助けてください。
前もって感謝します。
100行を返す選択があります。一部の行の列の 1 つで、通常のvarchar(2)
値が得られます。しかし、いくつかの行では、このような文字列を取得します1}33}47}48}50}86}98}UC}AL}MH}88
}
上記の関数を区切り記号の後に分割し、行として返したいと思います。
誰でもこれで私を助けてください。
前もって感謝します。
まず、単純な文字列分割関数を作成します。
CREATE FUNCTION [dbo].[SplitString]
(
@List NVARCHAR(MAX),
@Delim VARCHAR(255)
)
RETURNS TABLE
AS
RETURN ( SELECT [Value] FROM
(
SELECT
[Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
FROM sys.all_objects) AS x
WHERE Number <= LEN(@List)
AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
) AS y
);
次に、次のように使用できますCROSS APPLY
。
DECLARE @x TABLE(id INT, string VARCHAR(32));
INSERT @x VALUES(1,'34'),(2,'12{43{65{88{43{12{90{CD');
SELECT x.id, f.Value
FROM @x AS x
CROSS APPLY dbo.SplitString(x.string, '{') AS f;
結果:
ID Value
---- -----
1 34
2 12
2 43
2 65
2 88
2 43
2 12
2 90
2 CD
分割関数の詳細 (およびアプリケーション層からの文字列を分割する場合のより良い代替手段):
http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings
http://www.sqlperformance.com/2012/08/t-sql-queries/splitting-strings-now-with-less-t-sql