0

我想在其中一個表上實現交換機分區,並且確保分區函數,方案,文件組正常工作。但是當我運行下面的命令時,我得到文件組錯誤。有人可以分享你的想法。由於源表和目標表的文件組不匹配而導致交換分區失敗

命令: -

ALTER TABLE XYZ SWITCH PARTITION 5 TO ABC PARTITION 5; 

錯誤: -

ALTER TABLE switch語句失敗。表'XYZ'在文件組'PRIMARY'中,表'ABC'的分區5在文件組'FG_5'中。

+0

如何避免此錯誤,因爲我在多個文件組中分配表。 – Teja

+0

兩個表是否在同一個數據庫中? –

+0

是的,兩者都在相同的數據庫 – Teja

回答

0

某些集羣索引可能會在現有表上創建。因此,在可能不同的表上創建羣集索引期間會提到文件組。或者如果你可以刪除ABC表並重新創建並嘗試你的查詢。

查詢檢查表和索引名稱的文件組。

select f.name,o.name,i.name from sys.indexes i inner join sys.filegroups f on i.data_space_id=f.data_space_id 
inner join sys.all_objects o on o.object_id= i.object_id 
where o.name in ('ABC','XYZ') 

我不會說這是解決方案,但這應該有助於解決問題。

+0

我正在做的一件事就是在做ALTER SWITCH PARTITION之前我正在刪除源表上的聚集列存儲索引。 – Teja

+0

你能運行我提到的查詢來查看與你的表相關的文件組嗎?你是否嘗試刪除目標表並創建一個新表並嘗試查詢? –

0

該錯誤指示源表和目標表不存儲對齊。運行下面的查詢以確保源文件組和目標文件組在表和索引中都相同:

SELECT 
    OBJECT_NAME(p.object_id) AS ObjectName, 
    i.name AS IndexName, 
    p.index_id AS IndexID, 
    ds.name AS PartitionScheme, 
    p.partition_number AS PartitionNumber, 
    fg.name AS FileGroupName, 
    prv_left.value AS LowerBoundaryValue, 
    prv_right.value AS UpperBoundaryValue, 
    CASE pf.boundary_value_on_right WHEN 1 THEN 'RIGHT' ELSE 'LEFT' END AS PartitionFunctionRange, 
    p.rows AS Rows 
FROM 
    sys.partitions AS p INNER JOIN 
    sys.indexes AS i ON i.object_id = p.object_id AND i.index_id = p.index_id INNER JOIN 
    sys.data_spaces AS ds ON ds.data_space_id = i.data_space_id INNER JOIN 
    sys.partition_schemes AS ps ON ps.data_space_id = ds.data_space_id INNER JOIN 
    sys.partition_functions AS pf ON pf.function_id = ps.function_id INNER JOIN 
    sys.destination_data_spaces AS dds2 ON dds2.partition_scheme_id = ps.data_space_id AND dds2.destination_id = p.partition_number INNER JOIN 
    sys.filegroups AS fg ON fg.data_space_id = dds2.data_space_id LEFT OUTER JOIN 
    sys.partition_range_values AS prv_left ON ps.function_id = prv_left.function_id AND prv_left.boundary_id = p.partition_number - 1 LEFT OUTER JOIN 
    sys.partition_range_values AS prv_right ON ps.function_id = prv_right.function_id AND prv_right.boundary_id = p.partition_number 
WHERE 
    p.object_id IN (
     OBJECT_ID(N'dbo.ABC') 
     , OBJECT_ID(N'dbo.XYZ') 
    ) 
    AND p.partition_number = 5 
ORDER BY 
    ObjectName 
    ,IndexName 
    ,PartitionNumber; 
+0

當我運行此查詢時沒有行被返回... Infact我刪除了p.object_id部分,但仍然沒有行返回... – Teja

+0

我實際上是在源表上創建聚集列存儲索引,然後在切換分區之前刪除它... – Teja

+0

@Teja,是否對分區的集羣列索引存儲索引進行分區?我更新查詢以返回分區和非分區表/索引。 –

相關問題