zoukankan      html  css  js  c++  java
  • SQL Server 2005:查看分区表(partition table)的分区范围(partition range)

    SQL Server 2005 的分区表(partition table)是复杂的,特别是对于初学者来说。不管怎样,我们还是掌握了分区函数(partition function),分区方案(partition scheme),最后终于创建了一个分区表出来。但之后呢,或许你想查看分区表的各个分区分区列的取值范围(这个分区的理论最小值和最大值),虽然可以通过分区函数中定义的边界值(boundary value)来推算出来分区表每个分区(partition)的取值范围,但是事情并不是很简单,你需要一系列繁琐的步骤来实现:首先要找出这个分区表的分区函数;然后确定该分区函数定义的边界值属于 left 或者 right; 最后在脑子里使劲思索几下终于确定了分区列取值范围(partition range)。幸运的是,有了下面的这个存储过程,你的大脑就可以获得解放了。

    if exists (select 1 from sys.procedures where name = 'sp_show_partition_range')
       drop procedure dbo.sp_show_partition_range
    go
    
    --------------------------------------------------------------------------------
    -- author : p.c.w.l
    -- source : www.sqlstudy.com
    -- create : 2008-01-01
    -- descr  : view partition range by 'partition table' or 'partition function'
    --------------------------------------------------------------------------------
    
    create procedure dbo.sp_show_partition_range
    (
       @partition_table    nvarchar(255) = null
      ,@partition_function nvarchar(255) = null
    )
    as
    begin
       set nocount on
    
       declare @function_id int
           set @function_id = null
    
       -- get @function_id base on @partition_table
       if len(@partition_table) > 0 begin
          select @function_id = s.function_id
            from sys.indexes i
                    inner join sys.partition_schemes s
              on i.data_space_id = s.data_space_id
           where i.index_id < 2
             and i.object_id = object_id(@partition_table)
             
          if @function_id is null
             return 1         
       end
    
       -- get @function_id base on @partition_function
       if len(@partition_function) > 0 begin
          select @function_id = function_id
            from sys.partition_functions
           where name = @partition_function
           
          if @function_id is null
             return 1        
        end
       
    
       -- get partition range
       select partition_function = f.name
             ,t.partition
             ,t.minval
             ,value = case when f.boundary_value_on_right=1 then '<= val <' else '< val <=' end
             ,t.maxval
         from (
               select h.function_id
                     ,partition = h.boundary_id
                     ,minval    = l.value
                     ,maxval    = h.value
                 from sys.partition_range_values h
                         left join sys.partition_range_values l
                   on h.function_id = l.function_id and h.boundary_id = l.boundary_id + 1
    
               union all
    
               select function_id
                     ,partition = max(boundary_id) + 1
                     ,minval    = max(value)
                     ,maxval    = null
                 from sys.partition_range_values
                group by function_id
              ) t
                  inner join sys.partition_functions f
             on t.function_id = f.function_id
          where f.function_id = @function_id
             or @function_id is null
          order by 1, 2
    end
    go
    
  • 相关阅读:
    @import的最优写法
    IE7 下hack的方法
    在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
    MySQL 依赖另外一个统计出来数据更新表数据的范例
    PHP的bool值
    Ubuntu 下如何配置Jira
    ubuntu 访问Windows的共享
    备份 mysql数据
    ubuntu从中文切换成英文的方法
    css锚点定位偏移原理兼容浏览器
  • 原文地址:https://www.cnblogs.com/chuncn/p/1395165.html
Copyright © 2011-2022 走看看