PATINDEX不是正则表达式函数。您只能使用一组有限的模式标识符和通配符。来自MSDN:
% :任何零个或多个字符的字符串。
_(下划线):任何单个字符。
[] :指定范围 ([af]) 或集合 ([abcdef]) 内的任何单个字符。
[^] : 不在指定范围 ([^af]) 或集合 ([^abcdef]) 内的任何单个字符。
以下将连续匹配九位数字,从 6、7、8 或 9 开始:
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
您对SUBSTRING的使用也不正确。看起来您的代码正试图从字符串中删除数字的字符。以下是如何获取删除数字的字符串:
DECLARE @str VARCHAR(MAX)
DECLARE @validchars VARCHAR(MAX)
SET @str = 'TESTING1234 997711056 sdfgdfg'
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
DECLARE @idx INT
SET @idx = PATINDEX('%'+ @validchars +'%',@str)
IF @idx > 0 AND
(@idx = LEN(@str)-8
OR PATINDEX(SUBSTRING(@str,@idx+9,1),'[0-9]')=0)
SET @str=REPLACE(@str,SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 9),'')
ELSE SET @str = ''
SELECT @str
您声明您只想从字符串中检索数字;这是如何做到的:
DECLARE @str VARCHAR(MAX)
DECLARE @validchars VARCHAR(MAX)
SET @str = 'TESTING1234 997711056 sdfgdfg'
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
DECLARE @idx INT
SET @idx = PATINDEX('%'+ @validchars +'%',@str)
IF @idx > 0 AND
(@idx = LEN(@str)-8
OR PATINDEX(SUBSTRING(@str,@idx+9,1),'[0-9]')=0)
SET @str=SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 9)
ELSE SET @str = ''
SELECT @str