我写了一个措辞,将一个很长的字符串写成小块,在完成一个项目的措辞后,它将它从@input中移除并继续,直到它找不到任何短语的项目。 我正在根据LIKE模式选择项目。
在某些情况下,它会选择消息的其他部分,然后以不定式循环结束。
我希望使用LIKE子句选择的模式格式为:
(1到9之间的任何数字)+(仅限可变长度A-Z)+'/'+ (仅可变长度A-Z)+ Cr或Lf或CrLf的空间。
--This is what I do have:
DECLARE @match NVarChar(100)
SET @match = '%[1-9][a-z]%'
DECLARE @input1 varchar(max),@input2 varchar(max)
SET @input1 ='1ABCD/EFGH *W/17001588 *RHELLO SMVML1C'
DECLARE @position Int
SET @position = PATINDEX(@match, @input1);
SELECT @position;
--after the loop- it is also 'catching' the 1C at the end of the string:
SET @input2 = '*W/17001588 *RHELLO SMVML1C'
SET @position = PATINDEX(@match, @input2);
SELECT @position
---In order to eliminate this, I have tried to change @match:
SET @match = '%[1-9][a-z][/][a-z]%'
SET @position = PATINDEX(@match, @input1);
SELECT @position --postion is 0, so the first item, that should have been selected, wasn't selected
SET @position = PATINDEX(@match, @input2);
SELECT @position --postion is 0
非常感谢您的帮助!
答案 0 :(得分:1)
尝试将匹配变量/条件更改为:
SET @match = '%[1-9][a-z]%[/][a-z]%'
这将为您提供所需的结果。松散地翻译它是说“给我第一场比赛的起始位置,模式是[任何] - [数字从1-9] - [单个字母从az] - [任何] - [斜线] - [单个来自AZ] - [什么]
。
希望这有帮助!
答案 1 :(得分:0)
我同意上述评论;这是一个需要使用正则表达式工具解决的正则表达式问题。我建议使用SimpleTalk创建的程序集。 You can get their code and read their very thorough article
不幸的是,此解决方案需要对数据库和服务器具有严格的管理权限,因此它不能作为脚本移植。但是,如果您定期在同一个数据库上进行开发,我认为这些函数值得花费任何精力。
只是转发,正则表达式是一个真正的处理猪并破坏SQL Server中的大部分索引效率。只有当你不能使用时才使用它。
答案 2 :(得分:0)
我不知道这是否能解决您的整个问题,但如果您可以在输入前添加空格,则可以修改模式以避免匹配没有前面空格的数字。
set @input = ' '+@input;
set @match = '% [1-9][a-z]%';
如果你需要你的模式来考虑其他空白,如Cr和Lf,你的模式可能如下所示:
set @match = '%[ '+char(13)+char(10)+'][1-9][a-z]%';