如何匹配 C# 中的 SQL 查询? [关闭]
Posted
技术标签:
【中文标题】如何匹配 C# 中的 SQL 查询? [关闭]【英文标题】:How to match SQL Queries in C#? [closed] 【发布时间】:2017-07-31 23:58:06 【问题描述】:我想匹配具有不同条件值的相同类型的 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查询中获取表名,但是如何获取参数呢?
【问题讨论】:
参数化查询? 您能解释一下“匹配查询”是什么意思吗?我不明白你要做什么。 你可能问错了问题What is the XY problem? @Siyual 请看更新后的问题 【参考方案1】:好的,我不是要挑你的语言,但我认为这在这里很重要。您的示例中的查询没有参数。它们在 WHERE 子句中有排除标准。听起来您要做的是比较两个查询的文本,以获取除 WHERE 子句之外的所有内容。 ANSI SQL 和 T-SQL 都遵循相同的约定,即在 SELECT 查询中,WHERE 子句位于 FROM 子句之后,任何 GROUP BY、HAVING 或 ORDER BY 子句之前。因此,如果您只想分析代码文本,您可以将其拉出并以这种方式进行比较。不过,您可能会想到的一个问题是 SQL 通常提供了完成同一件事的微妙不同的方法。例如,如果在您的示例中,您有 = 而不是 ,您可以使用 BETWEEN 运算符。
我认为您可能可以使用 SqlScriptDom 来做您想做的事,但我对它的帮助还不够。
【讨论】:
请查看更新后的问题。有没有图书馆已经这样做了? 我认为可以使用 Microsoft.SqlServer.TransactSql.ScriptDom 来编写。我不是专家。看这里the.agilesql.club/blog/Ed-Elliott/2015-11-07/…以上是关于如何匹配 C# 中的 SQL 查询? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在 SQL 中使用视图是不是更好,或者我应该只在我的 C# 代码中使用查询[关闭]