如何以编程方式检查(解析)SQL语句的有效性?

时间:2010-06-21 11:57:30

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

我正在尝试使我的集成​​测试更具幂等性。一个想法是在每次测试后执行回滚,另一个想法是如何以编程方式解析文本,类似于查询分析器或SSMS中的绿色复选框。

如何在不使用ADO.NET运行SQL Server的情况下解析命令?

更新 这是最终按预期工作的:

using (DbCommand executeOnly = Factory.DbCommand())
{
    executeOnly.Connection = command.Connection;
    executeOnly.CommandType = CommandType.Text;
    executeOnly.CommandText = "SET NOEXEC ON;" + sqlCommand;
    executeOnly.Connection.Open();
    executeOnly.ExecuteNonQuery();
}
//set more properties of command.
command.Execute();

出于莫名其妙的原因,“SET PARSEONLY ON”仅在查询分析器中有效。我无法在ADO.NET连接上设置它。它也是如此,因为PARSEONLY似乎只捕获语法错误,这不是常见的错误。 SET NOEXEC ON将捕获更多种类的错误,例如引用缺少的表或列的视图或存储过程中缺少的参数。

7 个答案:

答案 0 :(得分:37)

我认为你要找的命令是SET NOEXEC ON。如果为连接设置此项,则将解析查询但不会执行。另一种选择是SET PARSEONLY ON,但我真的不确定两者之间的区别是什么。

答案 1 :(得分:21)

+1给Eric的答案。但我发现SET FMTONLY ON也很有用,因为SET NOEXEC ON似乎没有引起所有错误。

e.g。

SELECT * FROM ATableThatDoesNotExist

使用SET NOEXEC ON运行它说它很成功,尽管数据库中没有表。使用SET FMTONLY ON运行它会抛出“无效对象名称”错误。

SET FMTONLY ON还会返回有关将返回的结果集的元数据,这可以非常方便

答案 2 :(得分:8)

SQL Server 2012可以使用以下系统过程和函数解析语法,过程和表:

They are supposedly replacing "SET FMTONLY".

我测试了它们,它们比“SET NOEXEC ON”和“SET PARSEONLY ON”好多了

示例:

不会抛出错误:

sp_describe_undeclared_parameters
    @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;'

将正确抛出错误(“SET NOEXEC”和“SET PARSEONLY”在这种情况下不会抛出错误):

sp_describe_undeclared_parameters 
  @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;SELECT object_id, name, type_desc FROM sys.NOTaTABLE;'

答案 3 :(得分:7)

使用以下查询

SET PARSEONLY ON
--Your query here
SET PARSEONLY OFF

答案 4 :(得分:6)

SET PARSEONLY:检查每个Transact-SQL语句的语法,并在不编译或执行语句的情况下返回任何错误消息。

答案 5 :(得分:6)

确实取决于测试的目的。

最可靠的方法是在每次测试后使用回滚,如果你的陈述适合它(不太重,不能使它可行)。

我过去已经这样做了,并且很高兴得到关于运行时问题的通知,我不会以任何其他方式抓住这些问题。

答案 6 :(得分:4)

VSTSDBPro有一个可以编程方式访问的查询解析器:http://blogs.msdn.com/b/gertd/archive/2008/08/21/getting-to-the-crown-jewels.aspx