解析T-SQL语句

Lan*_*ane 1 .net c# sql t-sql ado.net

我正在为我的应用程序创建一个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类来运行的开销.在许多非查询情况下,这不是最佳的.

我采用的方法是允许用户选择结果类型,"Table"(将运行SqlDataAdapter.Fill(...),'Value'(将运行ExecuteScalar)或'None'(其中)将运行ExecuteNonQuery).但我不希望它们暴露给ADO.NET实现细节.我希望它们只需在文本框中键入一个SQL脚本,点击一个执行按钮,程序将运行脚本和如果有数据网格,则返回数据网格中的结果集.

所以...我需要组件能够在执行之前解析SQL,以辨别是否会有运行脚本的结果集.

Rem*_*anu 6

哟不解析文本,因为您没有客户端所需的信息来确定请求是否会返回结果.接受类似的请求execute usp_anonymousProcedure 1,2;,你能告诉它是否会返回结果吗?显然不是.因此,您将请求发送到服务器并要求它只返回有关结果的元数据:

SET FMTONLY ON;
Run Code Online (Sandbox Code Playgroud)

仅返回客户端的元数据.可用于测试响应的格式,而无需实际运行查询.

您将其设置为on,在服务器上运行请求您的请求,然后您将知道请求返回的结果的形状.