2015-05-30 67 views
4

我需要找到不是]的第一個字符的索引。通常要匹配除X以外的任何字符,請使用[^X]的模式。問題在於[^]]只是簡單地關閉了第一個支架。第一部分[^]將匹配任何字符。是否可以匹配PATINDEX中不是']的任何字符?

LIKE operator的文檔中,如果向下滾動到「將通配符作爲文字使用」部分,它將顯示一個表格,用於指示模式內的文字字符,如[]。它沒有提到在雙括號內使用[]。如果該模式與LIKE運營商一起使用,則可以使用ESCAPE子句。 LIKE不會返回索引,並且PATINDEX似乎沒有用於escape子句的參數。

有沒有辦法做到這一點?

(這似乎是隨意的。把一些情況下它周圍,我需要匹配]緊跟一個字符不]爲了找到一個帶引號的標識符的結束。]]是裏面唯一的字符轉義引用標識符)。

回答

4

這是不可能的。 Connect項目PATINDEX Missing ESCAPE Clause已關閉,因爲無法修復。

我可能會使用CLR和正則表達式。

一個簡單的實現可能是

using System.Data.SqlTypes; 
using System.Text.RegularExpressions; 

public partial class UserDefinedFunctions 
{ 
    [Microsoft.SqlServer.Server.SqlFunction] 
    public static SqlInt32 PatIndexCLR(SqlString pattern, SqlString expression) 
    { 
     if (pattern.IsNull || expression.IsNull) 
      return new SqlInt32(); 

     Match match = Regex.Match(expression.ToString(), pattern.ToString()); 
     if (match.Success) 
     { 
      return new SqlInt32(match.Index + 1); 
     } 
     else 
     { 
      return new SqlInt32(0); 
     } 
    } 
} 

隨着例如使用

SELECT [dbo].[PatIndexCLR] (N'[^]]', N']]]]]]]]ABC[DEF'); 

如果這不是一個選項可能片狀的解決方法可能是替代不太可能在數據沒有這個字符語法中特殊的意義。

WITH T(Value) AS 
(
SELECT ']]]]]]]]ABC[DEF' 
) 
SELECT PATINDEX('%[^' + char(7) + ']%', REPLACE(Value,']', char(7))) 
FROM T 

(返回9

相關問題