2011-09-11 10 views
0

@ToSearchという文字列が与えられていると、文字列中のすべてのS文字のインデックスに一致する結果を得ることができます。たとえば :t-sql文字列を検索してインデックスを報告する

set @ToSearch = 'SQLServer 2008 includes a variety of string and null functions' ; 
set @Tofind = 's'; 

match 1  match 2 match 3  match 4 
----------- ----------- ----------- ----------- 
1    4    23  38 

私はこれを試してみましたが、私は疑いのように機能していません。

SET @ToSearchTemp = 
    SUBSTRING(@ToSearchTemp, CHARINDEX('s',@ToSearchTemp,1), LEN(@ToSearchTemp)); 

これをCTEまたは単にクエリで解決する方法はありますか。

答えて

1

あなたはcreate an auxiliary numbers table最初にあなたがして

SELECT number 
FROM numbers 
WHERE number <= LEN(@ToSearch) AND 
SUBSTRING(@ToSearch,number,LEN(@Tofind)) = @Tofind 

を行うことができればこれはあなたの行形式で結果が得られます。カラムフォーマットが本当に必要な場合は、PIVOTが必要ですが、最大数の結果を定義するか、動的SQLを使用する必要があります。

0
ALTER PROCEDURE StringSearch 
--(
@ToSearch VARCHAR(MAX) 
,@Tofind CHAR(1) 
--) 
AS 

DECLARE @Sentinel INT; 
SET @Sentinel =0; 
DECLARE @ToSearchTemp VARCHAR(MAX) 
SET @ToSearchTemp = @ToSearch 
DECLARE @Record int 
SET @Record=0; 
DECLARE @TestZero int 

DECLARE @Matches Table(Match1 int,Id int) 
While @Sentinel < LEN(@ToSearch) 
    Begin 
     INSERT INTO @Matches(Match1,Id) 
     VALUES(charindex(@Tofind,@ToSearchTemp)[email protected],@Sentinel+1) 
     set @ToSearchTemp = substring(@ToSearchTemp,charindex(@Tofind,@ToSearchTemp)+1,len(@ToSearchTemp)) 
     print @ToSearchTemp 
     SET @TestZero=charindex(@Tofind,@ToSearchTemp) 
     if @TestZero=0 
     break; 
     else 
     set @Record =charindex(@Tofind,@ToSearchTemp)[email protected] 
     SET @Sentinel= @Sentinel +1 
    End 

select [1] as Match1, [2] as Match2, [3] as Match3,[4] as Match4 

FROM 
(
select top 4 Match1,ID from @Matches 
)DataTable 
PIVOT 
(
    sum(Match1) 
    For ID 
    in ([1],[2],[3],[4]) 
) PivotTable 
+0

私はコピーと貼り付けに問題がありましたが、とにかくこれは私の質問に対する解決策です。私はすぐにcteの回答を投稿します。 – hidden

関連する問題