为什么系统版本的时态表无法合并?

时间:2018-01-11 22:40:04

标签: tsql sql-server-2016

我有这个错误,我不太了解。我有以下系统版本的时态表:

CREATE TABLE [dbo].[Dim_Table] (
columnA         int             IDENTITY,
--
columnB         nvarchar(10)    NOT NULL,
columnC         nvarchar(10)    NULL,
SysStartTime    datetime2       GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
SysEndTime      datetime2       GENERATED ALWAYS AS ROW END   HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME(SysStartTime,SysEndTime),
--
CONSTRAINT PK_ColumnB PRIMARY KEY CLUSTERED (ColumnB DESC)
)WITH(
    SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[Hst_Dim_Table],
                            DATA_CONSISTENCY_CHECK = ON)
);
GO

以下外部表:

CREATE EXTERNAL TABLE [dbo].[STG_M_Table2]
(
        id                  smallint      NULL,
        columnB             nvarchar(10)  NOT NULL,
        columnC             nvarchar(10)  NULL,
)  
WITH (LOCATION='/STG_M/Table/',   
        DATA_SOURCE = AzureStorage,  
        FILE_FORMAT = TextFileFormat  
);

两者分别很好。但是,如果我尝试执行以下MERGE(或UPDATE Sys版本的SET FROM external_table),我会收到以下错误:

Msg 7320, Level 16, State 110, Line 6
Cannot execute the query "Remote Query" against OLE DB provider "SQLNCLI11" for linked server "(null)". Unsupported operation has been executed. The target of an update, delete or insert operation must be a table, not a view. Modify the statement and re-run it.

MERGE声明:

MERGE INTO dbo.Dim_Table           AS Target
USING      dbo.STG_M_Table2        AS Source
ON         Target.columnB = Source.columnB
WHEN MATCHED THEN
    UPDATE
    SET Target.columnC            = Source.columnC,
WHEN NOT MATCHED THEN
    INSERT (columnB, columnC)
    VALUES (columnB, columnC)
;

我搜索了什么是视图,因为我是新手,使用SQL Server和交易SQL。快速阅读有关视图的内容给了我以下主要想法:一个虚拟表,其内容(列和行)由查询定义。 ..我不太了解它,它是怎么回事与我的系统版本表相关。

该问题存在于系统版本的时态表中,因为如果我将其更改为另一个表,即时态表或当前表,则代码运行良好。

任何人都可以帮助我吗?我不明白我做错了什么。系统版本的时态表和更新语句是否有任何精确性?

提前致谢!!

0 个答案:

没有答案