【问题标题】:Why does Azure Data Flow convert varbinary(1000) to varbinary(max) and how can I prevent this?为什么 Azure 数据流将 varbinary(1000) 转换为 varbinary(max),我该如何防止这种情况发生?
【发布时间】:2020-01-28 20:18:35
【问题描述】:

我的源表位于 Azure SQL Server 数据仓库中,有一个名为 Upline 的列,其数据类型为 varbinary(1000)。在位于同一 Azure SQL Server 数据仓库中的目标表中,数据类型和列名相同。我的问题出在填充目标表的 Azure 数据流中。

不是将数据插入到数据流中的接收器表中,而是在我的数据仓库中创建一个新表。这是正在创建的表的创建语句

CREATE TABLE [Common].[T_7be15bb497654f0c8eeb82459912f178]
(
    [EmployeeSK] [int] NULL,
    [EmployeeLastName] [nvarchar](max) NULL,
    [EmployeeFirstName] [nvarchar](max) NULL,
    [EmploymentStatus] [nvarchar](max) NULL,
    [HireDate] [date] NULL,
    [OriginalHireDate] [date] NULL,
    [TerminationDate] [date] NULL,
    [CurrentPosition] [nvarchar](max) NULL,
    [PreviousPosition] [nvarchar](max) NULL,
    [WorkAssignmentEffectiveStart] [date] NULL,
    [Region] [nvarchar](max) NULL,
    [District] [nvarchar](max) NULL,
    [Site] [nvarchar](max) NULL,
    [OnSiteDepartment] [nvarchar](max) NULL,
    [DepartmentName] [nvarchar](max) NULL,
    [ManagerDayForceEmployeeNumber] [nvarchar](max) NULL,
    [Upline] [varbinary](max) NULL,
    [Lvl] [int] NULL,
    [dimStartDate] [date] NULL,
    [dimEndDate] [date] NULL,
    [dimIsCurrent] [int] NULL,
    [dimHash] [nvarchar](max) NULL,
    [r7ace46966877481a90d6f8039c6524b5] [int] NULL
)

从图片中可以看出(如果可以看到图片),该表为 Upline 列提供了 varbinary(max) 数据类型。为什么会这样?我怎样才能阻止它发生?当我将此列从源表和目标表中取出时,它可以成功运行。但是,我需要专栏。数据流具有以下活动:源、选择、派生列、代理键和接收器。它正在做非常简单的事情,并且派生列中的上线没有被更改。

这是来自运行数据流的管道的错误消息: “发现从 VarBinary(Max) 到 VarBinary(1000) 的隐式转换需要 ANSI 截断警告。不支持此操作。显式使用 CONVERT 函数来执行此请求。”派生列活动中没有转换函数,所以我无法执行它给出的建议。

列中数据的最大长度为 24(使用 Select len(max(Upline))FROM [source table] 找到)。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • ADF 使用 Polybase 将数据写入这些临时表。名称始终为 [{target_schema}].[T_{someGUID}]。这样做时,字符串字段总是被定义为 VARCHAR(MAX)。我不知道 VARBINARY 做了同样的事情,但它确实有意义。
  • 您应该只看到这些表 A) 在 Polybase 执行期间或 B) 在数据流操作失败时作为残余。在这些情况下,它们可用于诊断数据问题。不幸的是,我对 VARBINARY 不够熟悉,无法就您的问题发生的原因提供更多见解。

标签: type-conversion azure-sql-data-warehouse


【解决方案1】:

我找到了解决方法。在目标表的创建语句中,我将 varbinary(1000) 更改为 varbinary(max),最后,我替换了这个结尾:

WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    CLUSTERED COLUMNSTORE INDEX
)
GO

用这个:

WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    HEAP
)
GO

现在,整个 create 语句如下所示:

CREATE TABLE [Common].[dimEmployee_temp]
(
    [EmployeeSK] [int] IDENTITY(1,1) NOT NULL,
    [DayForceEmployeeNumber] [nvarchar](255) NOT NULL,
    [ConaEmployeeNumber] [char](10) NULL,
    [EmployeeLastName] [nvarchar](255) NULL,
    [EmployeeFirstName] [nvarchar](255) NULL,
    [EmploymentStatus] [nvarchar](255) NULL,
    [HireDate] [date] NULL,
    [OriginalHireDate] [date] NULL,
    [TerminationDate] [date] NULL,
    [CurrentPosition] [nvarchar](255) NULL,
    [PreviousPosition] [nvarchar](255) NULL,
    [WorkAssignmentEffectiveStart] [date] NULL,
    [Region] [nvarchar](255) NULL,
    [District] [nvarchar](255) NULL,
    [Site] [nvarchar](255) NULL,
    [OnSiteDepartment] [nvarchar](255) NULL,
    [DepartmentName] [nvarchar](255) NULL,
    [UnionName] [nvarchar](255) NULL,
    [ManagerDayForceEmployeeNumber] [nvarchar](255) NULL,
    [Upline] [varbinary](max) NULL,
    [Lvl] [int] NULL,
    [dimStartDate] [date] NOT NULL,
    [dimEndDate] [date] NULL,
    [dimIsCurrent] [int] NOT NULL,
    [dimHash] [nvarchar](256) NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN,
    HEAP
)
GO

这并不能帮助我了解 Azure 数据流中发生了什么,但它确实运行成功并插入到表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 2022-01-06
    • 2012-08-26
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多