【问题标题】:Parsing T-SQL statements解析 T-SQL 语句
【发布时间】:2010-11-12 00:09:55
【问题描述】:

我正在为我的应用程序制作一个 SQL 脚本编辑器/执行器组件,其性质与 SQL Server Management Studio 或旧查询分析器非常相似。我正在使用 C#、.NET Framework 3.5 SP1。我的问题是我想让组件解析 SQL 以确定它是否应该使用 SqlCommand.ExecuteNonQuery()、SqlCommand.ExecuteScalar() 或 SqlDataAdapter.Fill(dataTable) 来运行脚本。目的是允许用户执行非查询,但也返回结果集供用户查看,就像 SSMS / 查询分析器会做的那样,但也向他们隐藏 ADO.NET 实现细节。

我通常会默认为 SqlDataAdapter.Fill(dataTable) 并始终返回 DataTable 供用户查看。这仍然会像 ExecuteNonQuery 那样运行非查询,但它具有使用较慢的 SqlDataAdapter 类来运行事物的开销。这在许多非查询情况下并不是最优的。

我采用的方法是允许用户选择结果类型,“表”(将运行 SqlDataAdapter.Fill(...)、“值”(将运行 ExecuteScalar)或“无” '(将运行 ExecuteNonQuery)。但我不希望他们暴露于 ADO.NET 实现细节。我希望他们只需在文本框中键入 SQL 脚本,点击执行按钮,程序就会运行脚本并在数据网格中返回一个结果集(如果有)。

所以...我需要组件能够在执行 SQL 之前对其进行解析,以辨别运行脚本是否会产生结果集。

【问题讨论】:

  • 当涉及到这样的事情时,我通常会问自己“我将如何人工决定使用哪一个?”问问自己,你什么时候使用它们?从那里您将知道如何让应用程序做出决定;你基本上是在为此写一个人工智能。在我看来,除非你预先知道数据太大或者只是一个单一的值,否则很难判断使用哪一个,除非它实际执行语句,否则应用程序不会知道这一点。
  • 而且,由于您基本上是在编写 AI,因此您需要担心它会变得具有自我意识,并决定它知道您的用户应该比他们更好地运行哪些查询。 :)

标签: c# .net sql tsql ado.net


【解决方案1】:

您不要解析文本,因为您在客户端中没有必要的信息来确定请求是否会返回结果。接受execute usp_anonymousProcedure 1,2; 之类的请求,你能判断它是否返回结果吗?显然不是。所以你将请求发送到服务器并要求它只是return the metadata about the result

SET FMTONLY ON;

仅将元数据返回给客户端。 可用于测试格式 在没有实际运行的情况下响应 查询。

你设置这个,在服务器上运行你的请求,然后你就会知道请求返回的结果的形状。

【讨论】:

    【解决方案2】:

    为什么不直接使用 ExecuteReader 执行 SQL?

    IDataReader 将包含零个或多个结果集。

    您可以遍历结果集,并使用 DataTable.Load(IDataReader) 将每个结果集加载到 DataTable 中 - 或者只使用 IDataReader/IDataRecord 成员来获取列名和数据。

    我看不出通过提前了解结果集的形状可以获得什么优势,而且我很确定现有的脚本执行器(如查询分析器)不会这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-20
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多