2017-03-10 48 views
-1

我想匹配具有不同条件的值相同类型的SQL查询的,如何匹配C#中的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,但假的第2和第3位。

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

是否可以用SqlScriptDom做到这一点?怎么样?我使用SqlScriptDom从SQL查询中获取表名,但是如何获取参数?

+1

参数化查询? –

+2

你能解释一下“匹配查询”是什么意思吗?我不明白你想要做什么。 – Siyual

+1

你可能会问错误的问题[**什么是XY问题?**](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

回答

1

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

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

+0

请查看更新后的问题。有没有图书馆已经这样做? – Deepan

+0

我认为可以用Microsoft.SqlServer.TransactSql.ScriptDom编写它。我不是专家。看这里https://the.agilesql.club/blog/Ed-Elliott/2015-11-07/Get-Started-With-The-ScriptDom –