复制活动自动创建 nvarchar(max) 列

Posted

技术标签:

【中文标题】复制活动自动创建 nvarchar(max) 列【英文标题】:Copy activity auto-creates nvarchar(max) columns 【发布时间】:2021-05-14 09:05:10 【问题描述】:

我有 Azure 数据工厂复制活动,它将 parquet 文件加载到 Azure Synapse。 Sink配置如下图:

数据加载完成后,我有一个这样的临时表结构:

然后我根据 stg one 创建临时表,它一直工作正常,直到今天新创建的表突然收到 nvarchar(max) 类型而不是 nvarchar(4000):

临时表创建现在失败并出现明显错误: 列 'currency_abbreviation' 的数据类型不能参与列存储索引。'

为什么 AutoCreate 表定义已更改,如何在没有 nvarchar(max) 列的情况下将其恢复为“正常”行为?

【问题讨论】:

【参考方案1】:

我也遇到了同样的问题!我正在使用数据工厂将 csv 文件读入我的 Azure 数据仓库,这曾经导致 nvarchar(4000) 列,但现在它们都是 nvarchar(max)。我也收到错误 列 xxx 的数据类型不能参与列存储索引。

我现在的解决方案是更改我的 SQL 代码并使用 CAST 来更改格式,但数据工厂中必须有一个设置才能恢复以前的结果...

【讨论】:

最后我选择了下一个解决方案:1)创建自动表的空副本,但使用 nvarchar(4000) 字段,2)从“with max”复制到“with 4000” , 3) 将“with max”重命名为某个 _old_name,将“with 4000”重命名为 origin “with max”名称 4) drop _old_name 它工作正常,一个缺点是初始运行 - 复制所有表需要更长的时间,但是下一次运行将使用新创建的结构正确的表

以上是关于复制活动自动创建 nvarchar(max) 列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nvarchar(max) 参数创建 CLR 存储过程?

nvarchar(max) 仍然被截断

如何将列从 nvarchar(max) 更改为 nvarchar(50)

sql中nvarchar(max)长度测试

nvarchar 连接 / 索引 / nvarchar(max) 莫名其妙的行为

NVARCHAR(MAX) 不能容纳 50478 个字符