2017-05-10 2 views
0

データを整理していて、A-Za以外の文字が含まれている文字列を拒否するpatindexを作成したいとします。 -z0-9./'-およびスペース。a-zA-Z0-9./- 'とスペースに一致するpatindexが必要

これは許されるべき特殊文字を拒否:

patindex ( '%[^A-Z0-9a-z./'-# ]%',stringtobetested) 

は、私は特別な文字をマスキングするべきか?悪い文字や良い文字は、指定された文字列に複数回現れることがあります。

ここで、stringtobetestedはabc#D-EFは合格しますが、abc * defは失敗します。

答えて

1

これはうまくいくはずです...置き換えを使用して、エスケープする問題を回避します。

declare @stringtobetested1 varchar(64) = 'abc#D-EF' 
declare @stringtobetested2 varchar(64) = 'abc*def ' 


select 
    @stringtobetested1 string1 
    ,replace(replace(replace(replace(@stringtobetested1,'''','#'),' ','#'),'/','#'),'.','#') string1changed 
    ,@stringtobetested2 string2 
    ,replace(replace(replace(replace(@stringtobetested2,'''','#'),' ','#'),'/','#'),'.','#') string2changed 
    ,patindex('%[^A-Z0-9a-z#-]%',replace(replace(replace(replace(@stringtobetested1,'''','#'),' ','#'),'/','#'),'.','#')) 
    ,patindex('%[^A-Z0-9a-z#-]%',replace(replace(replace(replace(@stringtobetested2,'''','#'),' ','#'),'/','#'),'.','#')) 
+0

ネストされた4つの置換は、文字列ごとに最大4つの文字を処理できることを意味しますか? –

+0

私はちょうど特殊文字を#で置き換えています...それは1#または7# – scsimon

+0

が存在するかどうかに関係なく渡されます、なぜそれらは入れ子ですか? –

0

私のクエリのテストをさらに実行し、要件に合わせて最大文字列長を調整してください。

DECLARE @TestString varchar(64) = 'abc#D-E/*F' 
, @MaxStringLen INT = 20 


;WITH cte AS(SELECT 1 number 
     UNION ALL 
     SELECT number + 1 
     FROM cte 
     WHERE number < @MaxStringLen 
) 

SELECT @TestString AS OriginalString 
    , CAST(CAST((SELECT SUBSTRING(@TestString, Number, 1) 
        FROM cte 
        WHERE Number <= LEN(@TestString) AND 
         SUBSTRING(@TestString, Number, 1) LIKE '%[A-Z0-9a-z-# ./'']%' FOR XML Path('')) 
        AS xml) AS varchar(MAX)) AS ConvertedString 
, CASE WHEN @TestString = CAST(CAST((SELECT SUBSTRING(@TestString, Number, 1) 
        FROM cte 
        WHERE Number <= LEN(@TestString) AND 
         SUBSTRING(@TestString, Number, 1) LIKE '%[A-Z0-9a-z-# ./'']%' FOR XML Path('')) 
        AS xml) AS varchar(MAX)) 
    THEN 1 ELSE 0 END IsAllowed 
関連する問題