$PARTITION (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

返回一组分区列值可以映射到任何指定分区函数的分区号。

Transact-SQL 语法约定

语法

[ database_name. ] $PARTITION.partition_function_name(expression)

参数

database_name

包含分区函数的数据库的名称。

partition_function_name

要对其应用一组分区列值的任何现有分区函数的名称。

expression

表达式 其数据类型必须匹配或隐式转换为其相应分区列的数据类型。 此参数也可以是当前参与 partition_function_name的分区列的名称。

返回类型

int

备注

$PARTITION 返回 1 和分区函数分区数之间的 int 值。

$PARTITION 返回任何有效值的分区号,无论分区表或索引中当前是否存在使用该分区函数的值。

示例

A. 获得一组分区列值的分区号

此示例将使用 RangePF1 创建一个将表或索引划分为 4 个分区的分区函数 $PARTITION 用于确定表示 RangePF1分区列的值 10将放入表的分区 1

CREATE PARTITION FUNCTION RangePF1(INT)
    AS RANGE LEFT
    FOR VALUES (10, 100, 1000);
GO

SELECT $PARTITION.RangePF1 (10);
GO

B. 获取分区表或索引的每个非空分区的行数

此示例演示如何使用 $PARTITION 返回包含数据的表的每个分区中的行数。

注意

若要执行此示例,必须先使用上一示例中的代码创建分区函数 RangePF1

  1. 为分区函数 RangePF1创建分区方案 RangePS1

    CREATE PARTITION SCHEME RangePS1
        AS PARTITION RangePF1
        ALL TO ('PRIMARY');
    GO
    
  2. RangePS1 分区方案中创建表 dbo.PartitionTablecol1 作为分区列。

    CREATE TABLE dbo.PartitionTable
    (
        col1 INT PRIMARY KEY,
        col2 CHAR (20)
    ) ON RangePS1 (col1);
    GO
    
  3. 将四行插入 dbo.PartitionTable 表中。 这些行根据分区函数 RangePF1 定义插入分区:110 转到分区 1,而 5001000 转到 3

    INSERT dbo.PartitionTable (col1, col2)
    VALUES (1, 'a row'),
        (10, 'another row'),
        (500, 'another row'),
        (1000, 'another row');
    GO
    
  4. 查询 dbo.PartitionTable 并使用 GROUP BY 子句中的 $PARTITION.RangePF1(col1) 查询包含数据的每个分区中的行数。

    SELECT $PARTITION.RangePF1 (col1) AS Partition,
           COUNT(*) AS [COUNT]
    FROM dbo.PartitionTable
    GROUP BY $PARTITION.RangePF1 (col1)
    ORDER BY Partition;
    GO
    

下面是结果集。

分区 COUNT
1 2
3 2

对于存在但不包含数据的分区号 2,不会返回行。

C. 返回分区表或索引的一个分区的所有行

以下示例将返回表 PartitionTable 的分区 3 中的所有行。

SELECT col1, col2
FROM dbo.PartitionTable
WHERE $PARTITION.RangePF1 (col1) = 3;

下面是结果集。

col1 col2
500 另一行
1000 另一行