2017-10-18 5 views
0
String = '45,12,37,89,10,107,64,97' 

をカンマで区切られた整数を渡すことによって、最大値を検索し、我々は数字の配列を言うと、それらの値の 最大値を見つけることができます。カンマ区切りの値をとる手順を作成し、ストアドプロシージャに文字列として

+0

SQL Serverには、複数の値(テーブル、XML、JSON)を保持する**設計**のタイプがあります。また、非常に弱い文字列処理機能もあります。だから、あなたは間違ったタイプの使用に挑戦していますか? –

+1

あなたの質問は本当にCSVデータを別々の行に取得する方法を尋ねています。その時点で質問に答えるのに 'SELECT MAX'が必要です。しかし、これはStack Overflowで既に答えられています。 –

答えて

0

以下のようにすることができます。

CREATE FUNCTION [dbo].[fnSplitString] 
(
     @str as varchar(max), 
     @delimiter as varchar(1) 
) 
RETURNS @TableReturn table(ID integer) 
AS 
BEGIN 
    IF (@str IS NULL or @str ='') 
     BEGIN 
       INSERT INTO @TableReturn SELECT 0 
     END 
    ELSE 
     WHILE (charindex(@delimiter,@str)>0) 
     BEGIN 
      INSERT INTO @TableReturn 
      SELECT SUBSTRING (@str,1,charindex(@delimiter,@str)-1) 
      SET @str = SUBSTRING (@str,charindex(@delimiter,@str)+1, len(@str)) 
     END 
     IF (@str <> '' and @str <> ',') 
     BEGIN 
      INSERT INTO @TableReturn SELECT @str 
     END 
    RETURN 
END 

データを抽出し、それを呼び出すための関数を作成します。

SELECT TOP(1)* FROM dbo.fnSplitString('45,12,37,89,10,107,64,97', ',') ORDER BY ID DESC 

さも:

SELECT MAX(ID) FROM dbo.fnSplitString('45,12,37,89,10,107,64,97', ',') 
0

私は、このメソッドはブックマークしています。ソースを覚えていないが、それは魅力のように機能する。あなたのためにそれを修正しました。試してみてください:

Create table #Testdata(Data varchar(max)) 
Insert #Testdata select '45,12,37,89,10,107,64' 


;with tmp(DataItem, Data) as (
select LEFT(Data, CHARINDEX(',',Data+',')-1), 
     STUFF(Data, 1, CHARINDEX(',',Data+','), '') 
from #Testdata 
union all 
select LEFT(Data, CHARINDEX(',',Data+',')-1), 
     STUFF(Data, 1, CHARINDEX(',',Data+','), '') 
from tmp 
where Data > '' 
) 
select max(cast(DataItem as int)) 
from tmp 
OPTION (maxrecursion 0) 
関連する問題