ADF - 列无法参与列存储索引

问题描述 投票:0回答:1

我在 Azure Synapse 中创建了一个表,它是数据库中 Azure SQL 源表的映射,定义为

CREATE TABLE [schemaName].[Notes]
( 
    [Id] [int]  NOT NULL,
    [Title] [nvarchar](MAX) COLLATE SQL_Latin1_General_CP1_CS_AS NULL,
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    HEAP
)

在 Azure 数据工厂中使用带有 UPSERT 的复制活动时,我在管道中收到以下错误:

错误代码=Sql操作失败,
类型=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,
消息=数据库操作失败。请搜索错误以获取更多详细信息。,
来源=Microsoft.DataTransfer.Connectors.MSSQL,
类型=Microsoft.Data.SqlClient.SqlException,
消息=语句失败。列“位置”的数据类型无法参与列存储索引。,
来源=框架 Microsoft SqlClient 数据提供程序

表上没有列存储索引,为什么会出现此错误?这是更新插入活动的问题吗?

azure-sql-database azure-data-factory azure-synapse upsert
1个回答
0
投票

声明失败。列“位置”的数据类型无法参与列存储索引。,

根据文档,出现您遇到的问题是因为以下列数据类型无法包含在列存储索引中,并且 SQL DW 默认情况下会创建具有聚集列存储索引的表。

nvarchar(max)、varchar(max) 和 varbinary(max)(适用于 SQL Server 2016 及之前版本以及非聚集列存储索引)

如果列包含在上面的列表中,您可以更改其数据类型以避免错误。

您可以从表中删除索引。您可以使用以下 T-SQL 命令来检查您的表是否有任何列存储索引并删除列存储索引:

--check if your table has any columnstore index
select * from sys.indexes AS i
INNER  JOIN sys.data_spaces AS ds ON i.data_space_id = ds.data_space_id
WHERE is_hypothetical = 0  AND i.type in (5, 6)
AND i.object_id = OBJECT_ID('dbo.Results');

-- drop the columnstore index
DROP INDEX [index_name] ON [table_name]
© www.soinside.com 2019 - 2024. All rights reserved.