我在 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 数据提供程序
表上没有列存储索引,为什么会出现此错误?这是更新插入活动的问题吗?
声明失败。列“位置”的数据类型无法参与列存储索引。,
根据文档,出现您遇到的问题是因为以下列数据类型无法包含在列存储索引中,并且 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]