2011-04-18 28 views
2

我正在写一个相当复杂的视图集,我将用它来创建一些非常复杂的选择语句。 为了避免出错,我在视图中包含了一些字段的ID和DESCRIPTION。说明只需要进行调试,因为我不需要它在最终查询中。 当然,一切正常,但为了提高性能,我希望能够轻松地包含/删除描述,以避免维护2个大的查询集(一个用于调试,一个用于真实的查询)。在sql server中是否有一个DEBUG开关将查询结果中的调试信息包含在内?

所以我想知道如果有可能有这样的:

select 
    FieldA, 
    FieldB #ifdef DEBUG, 
    FieldC, 
    FieldD #endif 

因此,如果调试开关是我得到:

select 
    FieldA, 
    FieldB, 
    FieldC, 
    FieldD 

否则我得到:

select 
    FieldA, 
    FieldB 

这是编译器的典型代码,但无论如何有没有一种技术可以在T-sql中有效地模拟这种技术?

回答

2

从工具箱:

一个在免费SSMS Tools Pack的特点是整合Racerx的溶液进入SSMS。有了它,您可以创建所谓的调试部分,类似于Racerx的示例。然后,您可以通过Combobox决定要执行的脚本的版本:Debug或“Release”,分别带或不带调试部分。

是这样的:

select 
    FieldA, 
    FieldB 
#-BeginDebug Put Description Here 
    , 
    FieldC, 
    FieldD 
#-EndDebug 
FROM t 
+0

感谢您的链接!这完全是我在找的东西。 – LaBracca 2011-04-21 12:12:27

0

您可以在存储过程中添加@debug参数。您的陈述将如下所示:

IF @Debug=0 
SELECT FiledA, FieldB 
ELSE 
SELECT FiledA, FieldB,FieldC,FieldD 
+0

这迫使我wrte两次声明,idaelly我一直在寻找的东西,不强迫我写两倍的语句,否则它几乎比maintiaing相同2个查询,这是我想要避免的。 – LaBracca 2011-04-18 12:25:47

2

不,并有很好的理由。

当你写一个查询程序:

select FieldA, FieldB, FieldC, FieldD ... 

优化看着一堆东西来构建查询计划,其中包括要退回列。如果列更改:

select FieldA, FieldC .... 

查询计划也可以更改。如果返回的所有列都在索引中,那么查询永远不会真正进入表(请参阅覆盖索引)。影响查询计划的其他项目包括可用索引,保存在表和索引上的统计信息,以及在查询中筛选(何处和联合)哪些项目以及如何进行筛选。抛出一个OR在那里,你有时可以杀死性能。

SQL的目标是编写它,使其运行速度很快,而不是从编码器的角度来看,它不是冗余的和/或易于维护的。通过进行微小的更改,您可以轻松而彻底地改变查询的效率。诸如while x=1 begin... end之类的东西可以轻松并可预测地转换为机器码。但是,转换select x from ... join .. join..时使用的许多优化难以预测,即使对于高级开发人员也是如此。这些优化甚至可以随数据更改而改变。

如果你真的想这样的事情你需要做到以下几点:

1)写你的程序是这样的:

select 
    FieldA, 
    FieldB--||DEBUG||--, 
    --||DEBUG||--FieldC, 
    --||DEBUG||--FieldD 

2)对所有的程序为文本文件的工作(不只是在SSMS中的程序对象)
3)使用搜索和替换工具包括--||DEBUG||--评论(记住--被注释掉后在同一行上的任何东西)或将其替换为空字符串。
4)您可以运行带或不带调试信息的过程脚本。

+0

好的谢谢你的解释,我照你的建议去做。 – LaBracca 2011-04-18 13:31:42

相关问题