我正在尝试使我的集成测试更具幂等性。一个想法是在每次测试后执行回滚,另一个想法是如何以编程方式解析文本,类似于查询分析器或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
将捕获更多种类的错误,例如引用缺少的表或列的视图或存储过程中缺少的参数。
答案 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