2013-02-21 5 views
2

문자열 유효성 검사에 대한 빠른 질문.SQL에서 목록 입력 유효성 확인

결과를 필터링하는 많은 매개 변수 입력을 사용하여 저장 프로 시저를 구현하고 있습니다. 그것은 주로 SSRS 보고서 뒤에 앉아있을 것입니다.

사용자가 단일 값 또는 SQL 형식의 목록 (예 : 'a', b ', ...)을 입력 할 수 있도록 프로세스를 설정했지만 목록을 인식하는 방법은 매우 기초적입니다. 이 - 우리는 목록을 잘 넘어 형성된다 확인하고 싶습니다 예를 들어 'item',
의 단일 인스턴스가 년대 경우 우리가 확인하고, 즉

if patindex('%''%'',%',) <> 0 

는 - 목록이 'item',의 시리즈로 구성되어 있음을, 즉 블록이 'item' 블록으로 끝나고 쉼표가없는 짝수 개의 아포스트로피 등이 있습니다. 그렇지 않은 경우 비 기술적 사용자에게보고 할 수 있습니다.

TSQL에서이 작업을 수행하기위한 제안이 있으십니까? 아니면 SSRS가 더 좋은 위치에있는 것입니까? (나는 거의 완전히 SSRS에 대해 처음이다.)

답변

1

t-sql의 문자열 분할 기능을 사용하여 항목을보다 관리하기 쉬운 정보로 분리하는 것이 좋습니다. 그런 다음, 같은 것을 사용 :

if (select count(1) 
     from dbo.StringSplit('''item1'', ''item2'', ''item3''', ',') 
    where StringPart not like '''%''') > 0 
... 

여기 참조 내 personnal 문자열 분할 기능입니다 :

create function [dbo].[StringSplit] (@p_String varchar(max), @p_Delimiter char(1) = ',') 
returns @ReturnTable table (
    [Index] int identity(1, 1) not null, 
    [StringPart] varchar(4000) not null 
) as 
begin 

    declare @EndPosition int 
    declare @StartPosition int = 0; 
    declare @TextPosition int = 1; 
    declare @ChunkLength smallint 
    declare @TemporaryString varchar(4000) = ''; 
    declare @LeftOverString varchar(4000) = ''; 
    declare @TemporaryValue varchar(4000) = ''; 

    while @TextPosition <= Len(@p_String) 
    begin 
     set @ChunkLength = 4000 - Len(@LeftOverString) 
     set @TemporaryString = @LeftOverString + SubString(@p_String, @TextPosition, @ChunkLength) 
     set @TextPosition = @TextPosition + @ChunkLength 
     set @EndPosition = CharIndex(@p_Delimiter, @TemporaryString) 
     while @EndPosition > 0 
     begin 
     insert @ReturnTable values (LTrim(RTrim(SubString(@TemporaryString, @StartPosition + 1, @EndPosition - @StartPosition - 1)))) 
     set @StartPosition = @EndPosition 
     set @EndPosition = CharIndex(@p_Delimiter, @TemporaryString, @StartPosition + 1) 
     end 
     set @LeftOverString = Right(@TemporaryString, Len(@TemporaryString) - @StartPosition) 
    end 

    insert @ReturnTable values (LTrim(RTrim(@LeftOverString))) 

    return 

end 
+0

죄송는 응답 걸 렸어요가. 이 점에 대해 대단히 감사드립니다. 좋은 접근 방법이며 도움은 대단히 감사하겠습니다. – DanBennett