Tsql 是否可以匹配任何在PATINDEX中不是']'的字符?

Tsql 是否可以匹配任何在PATINDEX中不是']'的字符?,tsql,Tsql,我需要找到第一个不是的字符的索引。通常,要匹配X以外的任何字符,请使用模式[^X]。问题在于[^]]过早地关闭了第一个括号。第一部分[^]将匹配任何字符 在的文档中,如果向下滚动到使用通配符作为文本的部分,它将显示一个方法表,用于在模式中指示文本字符,如[and]。它没有提到在双括号内使用[或]。如果该模式与LIKE运算符一起使用,则可以使用ESCAPE子句。LIKE不返回索引,PATINDEX似乎没有转义子句的参数 没有办法做到这一点吗 这似乎是武断的。为了给它添加一些上下文,我需要立即匹配]

我需要找到第一个不是的字符的索引。通常,要匹配X以外的任何字符,请使用模式[^X]。问题在于[^]]过早地关闭了第一个括号。第一部分[^]将匹配任何字符

在的文档中,如果向下滚动到使用通配符作为文本的部分,它将显示一个方法表,用于在模式中指示文本字符,如[and]。它没有提到在双括号内使用[或]。如果该模式与LIKE运算符一起使用,则可以使用ESCAPE子句。LIKE不返回索引,PATINDEX似乎没有转义子句的参数

没有办法做到这一点吗


这似乎是武断的。为了给它添加一些上下文,我需要立即匹配]后跟一个非]字符,以便找到带引号的标识符的结尾。]]是引用标识符中唯一的字符转义。

这是不可能的。由于无法修复,连接项已关闭

我可能会使用CLR和正则表达式

一个简单的实现可能是

使用System.Data.SqlTypes; 使用System.Text.RegularExpressions; 公共部分类UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction] 公共静态SqlInt32 PatIndexCLRSqlString模式,SqlString表达式 { 如果pattern.IsNull | | expression.IsNull 返回新的SqlInt32; Match Match=Regex.Matchexpression.ToString,pattern.ToString; 如果匹配,成功 { 返回新的SqlInt32match.Index+1; } 其他的 { 返回新的SqlInt320; } } } 举例说明用法

选择[dbo].[PatIndexCLR]N'[^]',N'\\\\\\\\\\\\\\\\\\]]ABC[DEF'; 如果这不是一个选项,那么一个可能的解决方法可能是替换数据中不太可能出现的字符,而在语法中没有这种特殊意义

以TValue作为 选择“\\\\\\\\\]]ABC[DEF” 选择PATINDEX“%[^'+char7+']%',REPLACEValue']',char7 从T 返回9