如何以编程方式检查(parsing)TSQL语句的有效性?

我试图让我的集成testing更幂等。 一个想法是在每次testing之后执行回滚,另一个想法是如何以编程方式parsing文本,类似于查询分析器或SSMS中的绿色checkbox。

如何让SQL Serverparsing我的命令而不使用ADO.NET运行它?

更新:这是最后如期工作:

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将捕获更广泛的错误,比如在存储过程中引用缺less的表或列或缺less参数的视图。

我想你正在寻找的命令是SET NOEXEC ON 。 如果你为连接设置了这个,查询将被parsing,但是不会被执行。 另一个选项是SET PARSEONLY ON ,但我真的不知道两者之间的区别是什么。

+1给Eric的回答。 但是我发现SET FMTONLY ON也是有用的,因为SET NOEXEC ON似乎不会抛出所有的错误。

例如

 SELECT * FROM ATableThatDoesNotExist 

使用SET NOEXEC ON运行它说,它是成功的,尽pipe表中不存在数据库。 用SET FMTONLY ON运行它将会抛出“Invalid object name”错误。

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

SQL Server 2012可以使用以下系统过程和函数来parsing您的语法,过程和表格:

  • sp_describe_first_result_set(Transact-SQL)
  • sp_describe_undeclared_pa​​rameters(Transact-SQL)
  • sys.dm_exec_describe_first_result_set(Transact-SQL)
  • sys.dm_exec_describe_first_result_set_for_object(Transact-SQL)

他们正在取代“SET FMTONLY”。

我testing了他们,他们比“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;' 

使用以下查询

 SET PARSEONLY ON --Your query here SET PARSEONLY OFF 

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

真的这取决于testing的目的。

最可靠的方法是在每次testing之后使用回滚,如果你的陈述适合这种情况(不要太重以使其可行)。

我过去做过这件事,很高兴得到关于运行时问题的通知,我不会有任何其他办法。

VSTSDBPro有一个查询parsing器,您可以通过编程访问: http : //blogs.msdn.com/b/gertd/archive/2008/08/21/getting-to-the-crown-jewels.aspx