使用分区列中的值截断分区表?

baa*_*hen 4 sql-server partitioning

我已经在具有 varchar 数据类型的列上对表进行了分区。

\n\n

关于带有分区的截断表的文档使用分区ID:

\n\n
Truncate table parttable with (partitions (1,2,5))\n
Run Code Online (Sandbox Code Playgroud)\n\n

我只有分区列中的实际值的列表。

\n\n

如何从值列表中获取分区ID,以便可以在截断表语句中使用它?

\n\n

背景:

\n\n

我\xe2\x80\x99m 对分区仍然很陌生,需要验证我的计划。

\n\n

我有一个事实表,它按 varchar 数据类型的列进行分区。

\n\n

我有一个 etl 流程,可以在月初完全加载数据。

\n\n

之后加载的数据仅包含一个子集(分区列),并且需要完全替换事实表中的现有数据。

\n\n

我的计划是:

\n\n
    \n
  1. 首先将数据加载到临时表中。

  2. \n
  3. 截断临时表中分区值的事实表。

  4. \n
  5. 将临时表中的数据插入到事实表中。

  6. \n
\n\n

我这样做正确吗?

\n

Dav*_*oft 5

像这样:

create partition function pf(int) as range right for values (1,2,3,4,5)
create partition scheme ps as partition pf all to ([Primary])

create table parttable(id int primary key, a int, b int, c int) on ps(id)

insert into parttable(id,a,b,c) values (0,0,0,0), (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4),(5,5,5,5),(6,6,6,6)

Truncate table parttable with (partitions ($partition.pf(1),$partition.pf(2),$partition.pf(5)))

select * from parttable
Run Code Online (Sandbox Code Playgroud)

输出

id          a           b           c
----------- ----------- ----------- -----------
0           0           0           0
3           3           3           3
4           4           4           4
Run Code Online (Sandbox Code Playgroud)

您可以像这样动态地执行此操作:

declare @listOfPartitionColumnValues nvarchar(max) = '1,2,5'
declare @listOfPartitionNumbers nvarchar(max) = 
  ( 
    select string_agg(pn,',')
    from
    (
      select distinct $partition.pf(v.value) pn
      from string_split(@listOfPartitionColumnValues,',') v
    ) p
  )
declare @sql nvarchar(max) = concat('truncate table parttable with (partitions (',@listOfPartitionNumbers ,'))')

print @sql
exec (@sql)
Run Code Online (Sandbox Code Playgroud)