为什么合并到历史表中具有非聚集索引的时态表会引发错误

问题描述 投票:0回答:1

当我尝试在某些条件下合并时,出现以下错误。有人能够解释为什么吗?好像是SQL Server本身的问题,但我想把它贴在这里确认一下。

尝试将不可为 NULL 的列的值设置为 NULL。

  1. 目标表必须进行版本控制
  2. 历史表必须有非聚集索引
  3. 必须插入足够的记录。在下面的示例中,合并 2731 条记录失败,但合并 2730 条记录就好了

我正在使用 SQL Server 2017,但也在 Azure SQL 中观察到它

BEGIN TRANSACTION
SET XACT_ABORT ON;

CREATE TABLE RandomNumberHistory (Id INT NOT NULL, Number INT NOT NULL, [ValidFrom] DATETIME2 NOT NULL, [ValidTo] DATETIME2 NOT NULL);
CREATE TABLE RandomNumber (Id INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY, Number INT NOT NULL, 
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START, 
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END, 
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.RandomNumberHistory));

/* Problematic index */
CREATE NONCLUSTERED INDEX [IX_RandomNumberHistory] ON RandomNumberHistory(Number);

CREATE TABLE #MergeTable (Number INT NOT NULL);

;WITH CTE AS
(
    SELECT ABS( CAST( CAST( NEWID() AS VARBINARY) AS INT ) ) % 100000 AS RandomNumber, 1 AS Counter
    UNION ALL
    SELECT ABS( CAST( CAST( NEWID() AS VARBINARY) AS INT ) ) % 100000 AS RandomNumber, Counter + 1 AS Counter
    FROM CTE
    WHERE CTE.Counter < 50000 /* Seems to fail starting at 2731 records */
)
INSERT INTO #MergeTable (CTE.Number)
SELECT RandomNumber
FROM CTE
OPTION (MAXRECURSION 0);

MERGE RandomNumber AS Target
USING (
    SELECT Number
    FROM #MergeTable
) AS Source
ON Target.Number = Source.Number
WHEN NOT MATCHED BY TARGET
THEN INSERT (Number) VALUES (Source.Number)
WHEN MATCHED THEN DELETE;
;

ROLLBACK TRANSACTION
sql-server azure-sql-database sql-server-2017 sql-merge temporal-tables
1个回答
0
投票

将创建表编辑为:

CREATE TABLE RandomNumber (Id INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY(1,1), Number INT NOT NULL, 
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START, 
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END, 
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.RandomNumberHistory));
© www.soinside.com 2019 - 2024. All rights reserved.