如何以编程方式检查(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_parameters(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