Sql server 需要patindex匹配a-zA-Z0-9./-”和空间
我正在清理一些数据,并希望创建一个patindex,该patindex将拒绝包含除a-Za-z0-9./'-和空格以外的任何字符的任何字符串 这拒绝了应允许的特殊字符:Sql server 需要patindex匹配a-zA-Z0-9./-”和空间,sql-server,Sql Server,我正在清理一些数据,并希望创建一个patindex,该patindex将拒绝包含除a-Za-z0-9./'-和空格以外的任何字符的任何字符串 这拒绝了应允许的特殊字符: patindex ( '%[^A-Z0-9a-z./'-# ]%',stringtobetested ) 我应该掩盖这些特殊的角色吗?坏字符和/或好字符可以在给定字符串中出现多次 因此,当stringtobetested为abcD时,EF应该通过,但abc*def应该失败。这应该可以。。。它只是使用replace来解决您正
patindex ( '%[^A-Z0-9a-z./'-# ]%',stringtobetested )
我应该掩盖这些特殊的角色吗?坏字符和/或好字符可以在给定字符串中出现多次
因此,当stringtobetested为abcD时,EF应该通过,但abc*def应该失败。这应该可以。。。它只是使用replace来解决您正在逃避的问题
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,'''','#'),' ','#'),'/','#'),'.','#'))
请为我的查询运行更多测试,并调整最大字符串长度以满足您的要求
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
这一切都可以通过PATINDEX完成,您只需要一些语法帮助:
WITH test AS (
SELECT val
FROM (VALUES ('abc#D-EF./ -'''), ('abc*def')) AS t (val)
)
SELECT
input = t.val,
result = IIF(PATINDEX('%[^A-Z0-9a-z./''# -]%', t.val) > 0, 'fails', 'passes')
FROM test t;
首先,模式本身是一个字符串,而T-SQL中的字符串通过将其加倍来“转义”。其次,在模式中的[^]通配符中,当-出现在两个字符之间时,用于定义字符范围。通过将其移动到通配符模式的末尾,它将被逐字处理
其他特定于模式通配符的转义序列可以在此文档页面中找到:四个嵌套替换意味着它最多可以处理每个字符串4个?我只是将特殊字符替换为is all。。。不管是1还是7,它都会通过,所以为什么它们嵌套?我正在替换。空间、/和带有一个,以便patindex将其拾取。我编辑它是为了向你展示。。。请注意,空格已替换为for STRING2。嵌套为每个字符替换一个,这会导致patindex中的转义出现问题。