我有一个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 ErrorNumber:46723,MajorCode: 467,MinorCode:23,严重性:16,状态:1,错误信息:ak_beskrivelse, 类型异常 'Microsoft.SqlServer.DataWarehouse.Tds.PdwManagedToNativeInteropException' 被扔了。'。
我尝试将ak_beskrivelse列定义为其他外部表合法数据类型,例如varchar,但结果相同。
遗憾的是,我不允许编辑db1表中列的数据类型。
我认为错误与数据类型有关。任何想法如何解决它?
答案 0 :(得分: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')
答案 1 :(得分:1)
创建视图并转换文本值对我来说非常有用? 谢谢!
创建的视图 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')