我试图将数据合并到的目标表有 ~660 列。合并代码:
MERGE TBL_BM_HSD_SUBJECT_AN_1 AS targetTable
USING
(
SELECT *
FROM TBL_BM_HSD_SUBJECT_AN_1_STAGING
WHERE [ibi_bulk_id] in (20150520141627106) and id in(101659113)
) AS sourceTable
ON (...)
WHEN MATCHED AND ((targetTable.[sampletime] <= sourceTable.[sampletime]))
THEN UPDATE SET ...
WHEN NOT MATCHED
THEN INSERT (...)
VALUES (...)
Run Code Online (Sandbox Code Playgroud)
我第一次运行这个(即当表为空时)它导致成功,并插入了一行。
我第二次使用相同的数据集运行此程序时,返回错误:
无法创建大小为 8410 的行,该行大于允许的最大行大小 8060。
为什么我第二次尝试合并已经插入的同一行会导致错误。如果该行超过了最大行大小,则预计它不可能首先插入它。
所以我尝试了两件事,(成功了!):
为什么使用合并更新不成功,而插入可以,直接更新也可以?
更新:
设法找到实际的行大小 - 4978。我创建了一个只有这一行的新表,并通过这种方式找到行大小:
而且我仍然没有看到超出允许限制的东西。
更新(2):
努力使这种复制不需要任何额外的辅助对象,并且数据将(有点)混淆。
在 2012 版和 2008 版的几台服务器上尝试了这一点,并且能够在所有服务器中完全重现。
我有一个这样的表:
CREATE TABLE
dbo.DiscountBarcodeList
(
ID int NOT NULL IDENTITY
CONSTRAINT PK_DiscountBarcodeList
PRIMARY KEY CLUSTERED
, Discount int NOT NULL
CONSTRAINT FK_DiscountBarcodeList_Discount
FOREIGN KEY REFERENCES dbo.Discount (ID)
, CodeNumber int NOT NULL
, AssignedEntity int NULL
CONSTRAINT FK_DiscountBarcodeList_AssignedEntity
FOREIGN KEY REFERENCES dbo.Entity (ID)
ON DELETE SET NULL
, BarcodeID AS
CONVERT(
char(10)
, CAST(Discount AS binary(2)) + CAST(CodeNumber AS binary(3))
, 2)
, CONSTRAINT UQ_DiscountBarcodeList_DiscountCodeNumber
UNIQUE NONCLUSTERED
(
Discount ASC
, CodeNumber ASC
)
);
Run Code Online (Sandbox Code Playgroud)
该表将保存预先CodeNumber
分配给 s 的 …
index sql-server sql-server-2014 unique-constraint computed-column