朋友们,在我们写SQL脚本的时候,一些看似不起眼的问题,却可能让我们头疼不已。比如我们要写一个备份数据库的脚本。如果我们很清楚服务器的硬盘分区和使用情况,备份当然没问题,但是如果我们不知道服务器硬盘是如何分区的,每个分区有多少可用空间,那么备份语句你写的可能不容易执行。接下来,我将通过简单的SQL脚本来实现一些我们日常生活中可能遇到的“大问题”。检查硬盘分区和可用空间。这可以通过调用master数据库下的存储过程xp_fixeddrives轻松实现。EXECmaster..xp_fixeddrives获取数据库服务器的磁盘分区和可用空间。按姓氏笔画排序。这个问题看似简单,却可能让你一头雾水。通过调用MSSQL的字符集信息很容易实现。Select*FromtablenameOrderByfieldCollat??eChinese_PRC_Stroke_ci_as根据姓氏的笔画排序比较两个表是否相等这个看似简单的问题,平时的写法可能需要大量的SQL进行各种比较,下面的方法很简单。if(selectchecksum_agg(binary_checksum(*))fromtable1)=(selectchecksum_agg(binary_checksum(*))fromtable2)print'equal'elseprint'notequal'比较两表是否相等分页获取某条数据记录interval如果想得到top的item个数,大家都知道通过topn,如果数据本来有1000个item,那么想按照一定的方式排序后,第10到第11个item怎么处理呢?SQL提供了一个非常好用的ROW_NUMBER()函数,返回行号,灵活运用会有惊喜。其语法格式如下:ROW_NUMBER()OVER([partition_by_clause]order_by_clause)其中:partition_by_clause:将FROM子句生成的结果集划分到应用ROW_NUMBER()函数的分区中。可以理解为分组。order_by_clause:确定将ROW_NUMBER值分配给分区中的行的顺序。其实就是排序。知道了这一点,我们可以这样写:selectv.*from(selectROW_NUMBER()over(orderbysortingfield)asFRowID,*fromtablename)asvwherev.FRowIDbetweensequence1andsequence2anduseROW_NUMBERtointerpretrecords如果不想排序,只是要截取默认顺序的记录,可以这样写:select*from(selectROW_NUMBER()over(orderby(select0))asFRowID,*from表名)asvwherev.FRowIDbetweensequence1andsequence2。使用ROW_NUMBER截取记录与分组相关,这里不再赘述。查看某个表相关的视图、存储过程、函数,也是一件看似简单却令人头疼的事情。实际上,只需使用sysobjects和syscomments。selecta.*fromsysobjectsa,syscommentsbwherea.id=b.idandb.textlike'%表名%'查看引用表的所有视图、存储过程和函数,其中的技巧很多,以后慢慢探索吧。【编者推荐】数据库的主要特点是保障数据的安全性和可靠性,以及正确性和有效性。数据库达人的成长日记:SQLServer与MySQL达人的常见SQL区别数据库达人的成长日记:熟练使用SQL语句查看SQLServer的结构信息数据库达人的成长日记:如何在SQLServer查询中实现高效分页
