SQL Serverに組み込まれているネイティブのSTRING_SPLIT関数が、SQL Server 2016で追加されたことをご存知ですか? 私はコンサルタントとして、文字列で区切られた変数を使用可能なリストに分割するために使用されるスカラー関数を呼び出すコードを非常に多く目にします。 この方法を使っている人には、この関数を見てみることをお勧めします。 STRING_SPLITはテーブル型の関数で、デリミタで分割された文字列値を1列で返します。 この関数はT-SQLの中では珍しく、使用するには互換性レベル130以上が必要です(マイクロソフトは既存のユーザーコードに壊れるような変更を加えたくなかったのです)。 この方法を使用すると、はるかに効率的で、スカラー関数を呼び出さずに実行することができます。
構文
STRING_SPLIT ( string , separator)
使用方法
SELECT value AS 'Flavor' FROM STRING_SPLIT('Chocolate,Vanilla,Strawberry', ',');
結果
計画
以下がその計画の内容です。
カスタム関数
さて、ここではいくつかの環境で見られる自家製のバージョンがあります。
/****** Object: UserDefinedFunction . Script Date: 2/11/2020 6:26:45 PM ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION .( @sInputList VARCHAR(8000) -- List of delimited items , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items) RETURNS @List TABLE (item VARCHAR(8000))BEGINDECLARE @sItem VARCHAR(8000)WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 BEGIN SELECT @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) IF LEN(@sItem) > 0 INSERT INTO @List SELECT @sItem ENDIF LEN(@sInputList) > 0 INSERT INTO @List SELECT @sInputList -- Put the last item inRETURNEND
結果
結果は同じです。
計画
上で見たシーケンスを含む単純なものより、少し複雑になります。
動作させるために分割関数を記述する方法はたくさんありますが、SQL Server が分割関数を提供してくれたので、ぜひそれを見てみてください。 パフォーマンスチューニングの際には、今までのコードを見直して、このように改善する方法を探してみてください。 もっと詳しく知りたい方は、docs.microsoft.comでもっと多くの例を見ることができます。
著者への連絡先|DCACへの連絡先