如何在C#中匹配SQL查询?

时间:2017-03-10 15:17:36

标签: c# sql sql-server regex

我想匹配具有不同条件值的相同类型的SQL查询

例如:

SELECT * FROM Customer Where Age > 20 AND Age < 40

SELECT * FROM Customer Where Age > 30 AND Age < 50

除了WHERE条件(20,40,30和50)中的值之外,上述两个查询都是相同的。我想识别这样的查询。它也应该与HAVING一起使用。它应该适用于条件中的任何值类型(int,varchar,date等)。

基本上我想编写一个C#函数,我可以传递2个查询,如果两个查询除了排除条件中的值之外都应该返回true。

另一个例子:

SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders FROM (Orders
INNER JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID)
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 10;

SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders FROM (Orders
INNER JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID)
GROUP BY LastName
HAVING COUNT(Orders.OrderID) > 50;

SELECT Employees.FirstName, COUNT(Orders.OrderID) AS NumberOfOrders FROM (Orders
INNER JOIN Employees
ON Orders.EmployeeID=Employees.EmployeeID)
GROUP BY FirstName
HAVING COUNT(Orders.OrderID) > 50;

当我通过第一个和第二个查询时,它应该返回true,但是对于第二个和第三个查询则为false。

我试过使用正则表达式,但是如何找到参数所在的位置?它可以在任何地方。

是否可以使用SqlScriptDom执行此操作?怎么样?我正在使用SqlScriptDom从SQL查询中获取表名,但是如何获取参数?

1 个答案:

答案 0 :(得分:1)

好吧,我不是故意选择你的语言,但我觉得这里有点重要。您示例中的查询没有参数。它们在WHERE子句中有排除标准。听起来你正在尝试做的是比较除WHERE子句之外的所有内容的两个查询的文本。 ANSI SQL和T-SQL遵循相同的约定,即在SELECT查询中,WHERE子句位于FROM子句之后和任何GROUP BY,HAVING或ORDER BY子句之前。因此,如果您只是分析代码的文本,那么您可以将其拉出来并进行比较。您可能会想到的一个问题是SQL经常提供完全不同的方法来完成同样的事情。例如,如果在您的示例中,您使用&lt; =和&gt; =而不是&lt;和&gt;你可以使用BETWEEN运算符。

我认为你可能会使用SqlScriptDom来做你想做的事情,但我还不够好以帮助你。