文字列内のすべての列を置き換える方法
DECLARE @invalidColumns varchar(200) = 'abc, xyz'
DECLARE @sqltext varchar(max) = '((abc = ''sometext'') OR (xyz = '' some more text'')) OR
(pqr = ''vb'') AND ( abc != '' text '')
OR ((hht = ''asd asd'') AND ( xyz = '' More text '' ))
'
上記の例では、@sqlText で列 abc と xyz を検索し、それらをすべて 1=1 に置き換える必要があります
最終的な出力は次のようになります
((1 = 1) OR (1 = 1)) OR
(pqr = ''vb'') AND ( 1 != 1)
OR ((hht = ''asd asd'') AND ( 1 = 1 ))
私はこのようにしようとしましたが、置換機能がパターンで機能していないようです。また、最初の検索でのみ機能します。列 abc と xyz がステートメントに複数回現れる可能性があります。
SELECT CASE WHEN PATINDEX('%abc% ''%',@sqltext) > 0
THEN REPLACE (@sqlText,'%abc% ''%', '1=1')
END
どんな助けでも
編集
これを試しましたが、適切な結果が得られません
DECLARE @len INT
DECLARE @initializor INT = 1
DECLARE @First INT
DECLARE @Result VARCHAR(max) SET @Result = ''
DECLARE @EndPattern INT
SET @len = LEN(@sqltext)
WHILE( @initializor <= @len)
BEGIN
SET @First = PATINDEX('%abc% ''%', SUBSTRING(@sqltext, @initializor, @Len))
SET @EndPattern = 1
WHILE PATINDEX('%abc% ''%', SUBSTRING(@sqltext, @initializor, @EndPattern)) = 0
SET @EndPattern = @EndPattern + 1
IF COALESCE(@First, 0) <> 0
BEGIN
SET @Result = @Result + SUBSTRING(@sqltext, @initializor, @First - 1)
SET @initializor = @initializor + @First - 1
SET @EndPattern = 1
WHILE PATINDEX('%abc% ''%', SUBSTRING(@sqltext, @initializor, @EndPattern)) = 0
SET @EndPattern = @EndPattern + 1
-- Find end of pattern range
WHILE PATINDEX('%abc% ''%', SUBSTRING(@sqltext, @initializor, @EndPattern)) > 0
AND @Len >= (@initializor + @EndPattern - 1)
SET @EndPattern = @EndPattern + 1
--Either at the end of the pattern or @Next + @EndPattern = @Len
SET @Result = @Result + '''1=1'''
SET @initializor = @initializor + @EndPattern - 1
END
SET @initializor = @initializor + 1;
END
SELECT @Result