Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 需要patindex匹配a-zA-Z0-9./-”和空间_Sql Server - Fatal编程技术网

Sql server 需要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,该patindex将拒绝包含除a-Za-z0-9./'-和空格以外的任何字符的任何字符串

这拒绝了应允许的特殊字符:

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中的转义出现问题。