我可能应该因为问这个问题而被烧死了,但我不能为我的生活弄清楚为什么当我尝试在Visual Studio中调试这个片段时会抛出这个异常。我已经测试了这个正则表达式的CLR VB实现,它返回了预期的表结果:
MDX String Index Length
[Measures].[Product-To-Order %] 8 31
[Measures].[Gross Revenue (Stable)] 40 35
[Measures].[Product Count] 76 26
[Measures].[Total Order Count] 103 30
[Measures].[Average SKU Discount] 134 33
[Measures].[Average SKU Price Per Purchased Item] 168 49
[Component SKU].[Component SKU by Master Class].[All] 333 53
[Component SKU].[Component SKU by Master Class].[All] 690 53
[XL_Filter_Set_0] 749 17
[XL_Filter_Set_0] 806 17
[XL_Filter_HelperSet_0] 835 23
[XL_Filter_HelperSet_0] 887 23
...
Visual Studio似乎表示未处理的异常。 C#实现:
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Data.Sql;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Collections;
public static class RegExFunctions {
// RegEx matches
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true, IsPrecise = true, Name = "RegExMatches",
SystemDataAccess = SystemDataAccessKind.None, FillRowMethodName = "RegExMatchesRow")]
public static IEnumerable RegExMatches(SqlString input, SqlString pattern, SqlInt32 options)
{
try
{
if (input.IsNull || pattern.IsNull) return null;
Console.WriteLine(input);
Console.WriteLine(pattern);
IEnumerable matches = Regex.Matches(input.Value, pattern.Value, (RegexOptions)options.Value);
Console.WriteLine(matches);
//return matches;
return Regex.Matches(input.Value, pattern.Value, (RegexOptions)options.Value);
}
catch (RegexMatchTimeoutException)
{
// Do nothing. Assume that a timeout represents no match.
return null;
}
}
public static int Main()
{
IEnumerable result =
RegExMatches(
@"\[[^\]]*\](\.(&)?\[[^\]]*\])*",
@"SELECT {[Measures].[Product-To-Order %],[Measures].[Gross Revenue (Stable)],[Measures].[Product Count],[Measures].[Total Order Count],[Measures].[Average SKU Discount],[Measures].[Average SKU Price Per Purchased Item]} DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME ON COLUMNS , NON EMPTY Hierarchize({DrilldownLevel({[Component SKU].[Component SKU by Master Class].[All]},,,INCLUDE_CALC_MEMBERS)}) DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME,[Component SKU].[Component SKU by Master Class].[Master Component Class].[Class Category],[Component SKU].[Component SKU by Master Class].[Master Component Class].[ClID] ON ROWS FROM (SELECT Generate(Hierarchize({[Component SKU].[Component SKU by Master Class].[All]}) AS [XL_Filter_Set_0], TopCount(Filter(Except(DrilldownLevel([XL_Filter_Set_0].Current AS [XL_Filter_HelperSet_0], , 0,INCLUDE_CALC_MEMBERS), [XL_Filter_HelperSet_0]), Not IsEmpty([Measures].[Product-To-Order %])), 30, [Measures].[Product-To-Order %])) ON COLUMNS FROM [CLV] WHERE ([Shopping Lane].[Shopping Lane].[Shopping Lane Group].&[1],[Subentity].[Subentity Filter].[Subentity].&[2],[Event].[Category].&[-488],[Event].[Is Event].&[1],[Event].[Event Start Date].[All],[Event].[Start Date by Week].[Week].&[20160703])) WHERE ([Shopping Lane].[Shopping Lane].[Shopping Lane Group].&[1],[Subentity].[Subentity Filter].[Subentity].&[2],[Event].[Category].&[-488],[Event].[Is Event].&[1],[Event].[Event Start Date].[All],[Event].[Start Date by Week].[Week].&[20160703]) CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS",
1
);
Console.WriteLine(result);
return 0;
}
}
非常感谢任何帮助:)
答案 0 :(得分:0)
Rookie错误的参数顺序。这个电话实际上应该是这样的:
public static int Main()
{
IEnumerable result =
RegExMatches(
@"SELECT {[Measures].[Product-To-Order %],[Measures].[Gross Revenue (Stable)],[Measures].[Product Count],[Measures].[Total Order Count],[Measures].[Average SKU Discount],[Measures].[Average SKU Price Per Purchased Item]} DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME ON COLUMNS , NON EMPTY Hierarchize({DrilldownLevel({[Component SKU].[Component SKU by Master Class].[All]},,,INCLUDE_CALC_MEMBERS)}) DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME,[Component SKU].[Component SKU by Master Class].[Master Component Class].[Class Category],[Component SKU].[Component SKU by Master Class].[Master Component Class].[ClID] ON ROWS FROM (SELECT Generate(Hierarchize({[Component SKU].[Component SKU by Master Class].[All]}) AS [XL_Filter_Set_0], TopCount(Filter(Except(DrilldownLevel([XL_Filter_Set_0].Current AS [XL_Filter_HelperSet_0], , 0,INCLUDE_CALC_MEMBERS), [XL_Filter_HelperSet_0]), Not IsEmpty([Measures].[Product-To-Order %])), 30, [Measures].[Product-To-Order %])) ON COLUMNS FROM [CLV] WHERE ([Shopping Lane].[Shopping Lane].[Shopping Lane Group].&[1],[Subentity].[Subentity Filter].[Subentity].&[2],[Event].[Category].&[-488],[Event].[Is Event].&[1],[Event].[Event Start Date].[All],[Event].[Start Date by Week].[Week].&[20160703])) WHERE ([Shopping Lane].[Shopping Lane].[Shopping Lane Group].&[1],[Subentity].[Subentity Filter].[Subentity].&[2],[Event].[Category].&[-488],[Event].[Is Event].&[1],[Event].[Event Start Date].[All],[Event].[Start Date by Week].[Week].&[20160703]) CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS",
@"\[[^\]]*\](\.(&)?\[[^\]]*\])*",
1
);
Console.WriteLine(result);
return 0;
}
感谢@sln和@AlanMoore指出这一点!