【问题标题】:Azure SQL db query external Azure SQL DB - PPDwManagedToNativeInteropExceptionAzure SQL db 查询外部 Azure SQL DB - PPDwManagedToNativeInteropException
【发布时间】:2018-06-17 16:28:06
【问题描述】:

我有一个 Azure SQL 服务器,其中有多个数据库。我需要能够跨这些数据库进行查询,并且目前通过外部表解决了这个问题。此解决方案的一个挑战是外部表不支持与普通表相同的所有数据类型。

根据下面的文章,不兼容数据类型的解决方案是在外部表中使用其他类似的数据类型。 https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-tables-data-types#unsupported-data-types

DB1 中表的 DDL

CREATE TABLE [dbo].[ActivityList](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Registered] [datetime] NULL,
    [RegisteredBy] [varchar](50) NULL,
    [Name] [varchar](100) NULL,
    [ak_beskrivelse] [ntext] NULL,
    [ak_aktiv] [bit] NULL,
    [ak_epost] [bit] NULL,
    [Template] [text] NULL
 CONSTRAINT [PK_ActivityList] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

DB2 中外部表的 DDL

CREATE EXTERNAL TABLE [dbo].[NEMDBreplicaActivityList]
(
    [ID] [int] NOT NULL,
    [Registered] [datetime] NULL,
    [RegisteredBy] [varchar](50) NULL,
    [Name] [varchar](100) NULL,
    [ak_beskrivelse] [nvarchar](4000) NULL,
    [ak_aktiv] [bit] NULL,
    [ak_epost] [bit] NULL,
    [Template] [varchar](900) NULL
)
WITH (DATA_SOURCE = [DS],SCHEMA_NAME = N'dbo',OBJECT_NAME = N'ActivityList')

查询外部表NEMDBreplicaActivityList会产生如下错误

从以下位置检索数据时出错 server.database.windows.net.db1。这 收到的基本错误消息是: 'PdwManagedToNativeInteropException 错误编号:46723,主要代码: 467,次要代码:23,严重性:16,状态:1,错误信息:ak_beskrivelse, 类型异常 'Microsoft.SqlServer.DataWarehouse.Tds.PdwManagedToNativeInteropException' 被扔了。'。

我尝试将 ak_beskrivelse 列定义为其他外部表合法数据类型,例如 varchar,结果相同。

遗憾的是,我不允许编辑 db1 表中列的数据类型。

我假设错误与数据类型有关。任何想法如何解决它?

【问题讨论】:

  • ak_beskrivelse的实际最大长度是4000个字符吗?如果更大,请尝试 nvarchar(MAX)。同样,如果超过 8000 个字符,则为 Template 的 varchar(MAX)。
  • 少于4000个字符,是的。我试过 nvarchar(max) 和 varchar(max),结果一样。

标签: azure tsql azure-sql-database external-tables


【解决方案1】:

我通过在源表上创建一个视图来解决类似的问题,该视图将文本值转换为varchar(max),然后将外部表指向该视图。 所以:

CREATE VIEW tmpView
AS 
SELECT CAST([Value] AS VARCHAR(MAX))
FROM [Sourcetable].
Then:
CREATE EXTERNAL TABLE [dbo].[tmpView]
(
 [Value] VARCHAR(MAX) NULL
)
WITH (DATA_SOURCE = [myDS],SCHEMA_NAME = N'dbo',OBJECT_NAME = N'tmpView')

【讨论】:

    【解决方案2】:

    创建视图和转换文本值对我来说非常适合? 谢谢!

    创建的视图 vw_TestReport:

    SELECT CAST([Report Date] AS VARCHAR(MAX)) AS [Report Date]
    FROM     dbo.TestReport
    

    并从视图创建外部表:

    CREATE EXTERNAL TABLE [dbo].[TestReport](
        [Report Date] [varchar](max) NULL
    ) 
    WITH (DATA_SOURCE = [REFToDB],SCHEMA_NAME = N'dbo',OBJECT_NAME = N'vw_TestReport')
    

    【讨论】:

      猜你喜欢
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多