sql server Усекать разделы таблицы по имени раздела - PullRequest
0 голосов
/ 12 декабря 2018

Я создал многораздельную таблицу на сервере SQL следующим образом:

--Add File Groups
Alter Database Test Add Filegroup [Part_20181201]
Go
Alter Database Test Add Filegroup [Part_20181202]
Go

--create files 
Alter Database [Test] Add FILE ( NAME = N'Part_20181201', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Part_20181201.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_20181201]
Alter Database [Test] Add FILE ( NAME = N'Part_20181202', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Part_20181202.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ) TO Filegroup [Part_20181202]

--create partition function
CREATE PARTITION FUNCTION DailyFunction (datetime2) AS RANGE RIGHT FOR VALUES ('20181201','20181202');

--create schema
Create Partition Scheme Schemedaily as Partition DailyFunction
To (Part_Before20181201, [Part_20181201], [Part_20181202])

--Create TABLE 
Create TABLE [TempTable] (
   id int identity(0, 1) not null, 
   date datetime2 not null, 
   text char(8000)
)
On Schemedaily (date) ;

Если мы хотим урезать некоторые разделы:

TRUNCATE TABLE [dbo].[TempTable]
WITH (PARTITIONS (1 TO 2));

Теперь можно ли урезать раздел таблицыпо имени раздела?

Я имею в виду что-то вроде этого:

TRUNCATE TABLE [dbo].[TempTable] WITH (PARTITIONS (Part_20181201));

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Во-первых, это не имена разделов, а имена групп файлов.И документация довольно ясно говорит об этом:

<partition_number_expression> можно указать следующими способами:

• Укажите номер раздела, дляпример: WITH (PARTITIONS (2))

• Укажите номера разделов для нескольких отдельных разделов, разделенных запятыми, например: WITH (PARTITIONS (1, 5))

• Укажите и диапазоны, и отдельные разделы, например: WITH (PARTITIONS (2, 4, 6 TO 8))

<range> можно указать в качестве номеров разделов, разделенных словом TO, например: WITH (PARTITIONS (6 TO 8))

Вы можете найти номера разделов в файловой группе с помощью запроса, подобного этому:

SELECT p.partition_number
FROM sys.partitions p
INNER JOIN sys.indexes  i ON i.object_id = p.object_id and i.index_id = p.index_id
INNER JOIN sys.data_spaces ds ON ds.data_space_id = i.data_space_id
INNER JOIN sys.filegroups AS fg ON fg.data_space_id = i.data_space_id
WHERE p.object_id = object_id('dbo.TempTable')
  and gf.name = 'Part_20181201'
  and p.index_id = 1 /* clustered index or 0 for heaps */

А затем создать динамический sql для усечения вашей таблицы.

Вот запрос, чтобы проверить, к какой группе файлов относится каждый номер раздела, расположенный для каждого объекта и индекса в вашембаза данных:

SELECT object_name(p.object_id) as ObjectName, p.index_id, p.partition_number, fg.name
FROM sys.partitions p
INNER JOIN sys.indexes  i ON i.object_id = p.object_id and i.index_id = p.index_id
INNER JOIN sys.data_spaces ds ON ds.data_space_id = i.data_space_id
INNER JOIN sys.filegroups AS fg ON fg.data_space_id = i.data_space_id
order by ObjectName, p.index_id, p.partition_number, fg.name
0 голосов
/ 12 декабря 2018

По определению Microsoft С РАЗДЕЛАМИ , Нет, Вы не можете

можно указать следующими способами:

• Укажите числораздел, например: WITH (PARTITIONS (2))

• Укажите номера разделов для нескольких отдельных разделов, разделенных запятыми, например: WITH (PARTITIONS (1, 5))

• Укажите и диапазоны, и отдельные разделы, например:WITH (PARTITIONS (2, 4, 6 TO 8))

<range> можно указать как номера разделов, разделенные словом TO, например: WITH (PARTITIONS (6 TO 8))

Для усечения разделенной таблицы, таблицы и индексовдолжны быть выровнены (разделены на одну и ту же функцию разделения).

См. Удар по ссылкам https://docs.microsoft.com/en-us/sql/t-sql/statements/truncate-table-transact-sql?view=sql-server-2017

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...