2016-05-06 15 views
0

何度も尋ねられますが、この方法ではありません。SQL Server 2008でカスタム関数を使用しないでSTRING_SPLITを模倣する

私はSQL Server 2008を使用しており、STRING_SPLIT(2016年のような)機能はありません。

クエリは次の行とともに返されます。下の例の行の例を参照してください。何がはげに以下を参照すると、実際には単一のフィールドなので、1つのvarchar列は完全にそれを持っている:私は、パイプ|文字で分割することがしたいと思います

Appple|10|admin|845687|Apr|26|11:32:29|2016|AwesomeApplication.zip 

私はCTE、またはカスタム関数を書くことはできません。

CHARINDEXPATINDEXのような組み込みの文字列関数を使用して、1つのselect文の中で、個々のパイプで区切られた要素を異なる列に抽出する必要があります。

誰にも分かりませんか?

+0

その単一列がちょうどwhileループ分割関数からコードをコピーして、インラインで使用する場合、各トークンは –

+0

@AlexKを露出する点が存在することになります。それをより明確にするために質問を編集しました...実際にはクエリから来る1つのフィールド – Avithohol

答えて

4
DECLARE @Result Table(Value varchar(50)) 
DECLARE @x XML 
SELECT @X = CAST('<A>' + REPLACE(@StringList, '|', '</A><A>') + '</A>' AS XML) 

INSERT INTO @Result 
SELECT t.value('.', 'varchar(50)') as inVal 
FROM @X.nodes('/A') AS x(t) 

これにより、1つの列(値)を持つ表が作成されます。パイプで区切られた文字列の各分割値は、このテーブルに新しいレコードを作成します。あなたはそれに参加することができますが、好きです。これが不明であるか、SQL 2008でうまくいかない場合は教えてください。

必要に応じてvarcharのサイズを増やすことができます。また、別の値に分割するようにクエリを変更することもできます(カンマ区切り、など)。

+1

これは私にアイデアを与えました! – Avithohol

+0

それを聞いてうれしい! –

0
ALTER FUNCTION [dbo].[split] 
(
    @string varchar(max), 
    @separator varchar(1) -- longer separator is also possible 
) 
RETURNS 
@result TABLE (keyword varchar(max)) 
AS 
BEGIN 
declare @pos int=0, @res varchar(100) 
while len(@string)>0 
begin 
set @pos=CHARINDEX(@separator, @[email protected],0) 
select @res=left(@string,@pos),@string=SUBSTRING(@string,@pos+1,100) 
insert @result values(@res) 
end 
    RETURN 
END 
関連する問題