2014-09-04 12 views
1

"yyyy/mm-digit"(모든 메시지와 함께 숫자가 증가합니다)와 같은 코드를 받았습니다. 그래서 나는 사용자에 의해 보내지는 코드가 정확히 그 포맷으로되어 있는지 확인하고 싶다. 그래서 방법 ?문자열을 SQL의 정규 표현식과 비교합니다.

여기 내 코드를 확인하지만 항상 else 블록을 실행합니다. 이유가 무엇입니까? 참고 : 예 : "2014/8 자리"좀 패턴, 어떻게? 여기

(이것은 연도와 월에 대한 변경) 내 작은 노력이지만 dateitme 변환 실패 오류를 던지고 플러스는 이유는

Alter PROCEDURE TestTrigger 



AS 
BEGIN 
    Begin Try 
      Declare @msg as varchar(20) 
      SELECT @msg = '2014/9-1' 

      DECLARE @yyyymm varchar(255) = Convert(Varchar ,(cast(year(@msg) as varchar(255)) + '/' + 
           right(cast(month(@msg) as varchar(255)), 2) 
           )); 

       IF (@msg like @yyyymm + '-[0-9]%' and 
        @msg not like @yyyymm + '-%[^0-9]%' 
        ) 
        BEGIN 
        Print 'Done' 
        END 
        ELSE 
        BEGIN 
        Print 'Not Done' 
        END 
    END TRY 
    BEGIN CATCH 
    Select ERROR_MESSAGE() as ErrorMsg 
    END CATCH 

END 
GO 

답변

0

를 너무 다른 문제가 도움이되는 YEARMONTH 때문에 함수는 datetime 매개 변수를 필요로하며 '2014/9-1'은 유효한 datetime이 아닙니다.

당신은 정말 두 가지 형식 (지난 천년에있을 것 년 가정) 개월 1-9를위한 개월 10 ~ 12에 대한 yyyy/mm-digityyyy/m-digit을 가지고 있기 때문에,이 비교 사용할 수 있습니다

@msg LIKE '[1-2][0-9][0-9][0-9]/[1-9]-%' 
OR @msg LIKE '[1-2][0-9][0-9][0-9]/[1][0-2]-%' 
을 어떤 숫자가 아닌 문자가 나타나는 경우

그런 다음 자리가 유효한 번호인지 확인해야하는 경우 SUBSTRING 및 CHARINDEX를 사용하여 숫자를 추출 할 수 있습니다, 다음 확인 :

NOT SUBSTRING(@msg, CHARINDEX('-', @msg) + 1, LEN(@msg)) LIKE '%[^0-9]%' 

SELECT msg, 
     ValidDate = CASE WHEN msg LIKE '[1-2][0-9][0-9][0-9]/[1-9]-%' 
           OR msg LIKE '[1-2][0-9][0-9][0-9]/[1][0-2]-%' 
         THEN 1 
         ELSE 0 
        END, 
     ValidDigit = CASE WHEN SUBSTRING(msg, CHARINDEX('-', msg) + 1, LEN(msg)) LIKE '%[^0-9]%' 
          THEN 0 
          ELSE 1 
         END 
FROM (VALUES ('2014/9-1'), ('201/9-2'), ('2014/13-3'), ('2014/9-A'), ('2014/0-15x')) t (msg); 

그래서 난 당신의 코드가 될 것이라고 생각 뭔가 같은 :

DECLARE @msg VARCHAR(20) = '2014/9-1'; 

IF ((@msg LIKE '[1-2][0-9][0-9][0-9]/[1-9]-%' 
    OR @msg LIKE '[1-2][0-9][0-9][0-9]/[1][0-2]-%') 
    AND NOT SUBSTRING(@msg, CHARINDEX('-', @msg) + 1, LEN(@msg)) LIKE '%[^0-9]%') 
    BEGIN 
     PRINT 'Done'; 
    END 
ELSE 
    BEGIN 
     PRINT 'Not Done'; 
    END