您可以使用Microsoft自己的一些T-SQL解析引擎。
您可以在程序集Microsoft.Data.Schema.ScriptDom.dll
和Microsoft.Data.Schema.ScriptDom.Sql.dll
中找到它们。
TSql100Parser parser = new TSql100Parser(false);
IList<ParseError> errors;
Expression expr = parser.ParseBooleanExpression(
new StringReader(condition),
out errors
);
if (errors != null && errors.Count > 0)
{
// Error handling
return;
}
如果您没有收到任何错误,则该字符串是一个有效的过滤器表达式。虽然可能会有一些有害的表达。
如果您愿意,您可以通过自己的访问者运行表达式来检测任何不需要的构造(如子查询)。但请注意,对于Visit(...)
和ExplicitVisit(...)
,您都必须覆盖几乎所有650个过载。部分班会在这里很好。然后
当您满意,可以建立一个完整的SELECT
声明,所有的表达式:
var schemaObject = new SchemaObjectName();
schemaObject.Identifiers.Add(new Identifier {Value = "MyTable"});
var queryExpression = new QuerySpecification();
queryExpression.FromClauses.Add(
new SchemaObjectTableSource {SchemaObject = schemaObject});
// Add the expression from before (repeat as necessary)
Literal zeroLiteral = new Literal
{
LiteralType = LiteralType.Integer,
Value = "0",
};
Literal oneLiteral = new Literal
{
LiteralType = LiteralType.Integer,
Value = "1",
};
WhenClause whenClause = new WhenClause
{
WhenExpression = expr, // <-- here
ThenExpression = oneLiteral,
};
CaseExpression caseExpression = new CaseExpression
{
ElseExpression = zeroLiteral,
};
caseExpression.WhenClauses.Add(whenClause);
queryExpression.SelectElements.Add(caseExpression);
var selectStatement = new SelectStatement {QueryExpression = queryExpression};
...并把它所有回字符串:
var generator = new Sql100ScriptGenerator();
string query;
generator.GenerateScript(selectStatement, out query);
Console.WriteLine(query);
输出:
SELECT CASE WHEN ITEM_ID = 1
OR (ITEM_NAME LIKE 'something'
AND ITEM_PRICE > 123
AND (ITEM_WEIGHT = 456
OR ITEM_HEIGHT < 789)) THEN 1 ELSE 0 END
FROM MyTable
如果这种表达变得太大来处理,你总是可以分裂的规则成块,运行在几时间。
虽然,被允许重新分配Microsoft.Data.Schema.ScriptDom.*.dll
文件,你必须将自己的Visual Studio Team System中的许可证(这是包含在至少VS专业版/旗舰版?)
链接:http://blogs.msdn.com/b/gertd/archive/2008/08/22/redist.aspx
所以你要检查每个验证的100,000条规则......? – Chains
问题有点含糊,你的“规则”只是一系列的WHERE子句吧?你究竟想要测试什么(每个where子句返回0?)。另外,你说你有1000多条规则(where子句),你的目标是运行它们并验证它们全都返回0结果吗?你希望/计划如何处理失败? – Zachary
我们在讨论where子句中的约束条件吗? –