2011-09-11 1 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

관련 문제