相关疑难解决方法(0)

SQL Server 中的合并行大小溢出 - “无法创建大小的行..”

我试图将数据合并到的目标表有 ~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。

为什么我第二次尝试合并已经插入的同一行会导致错误。如果该行超过了最大行大小,则预计它不可能首先插入它。

所以我尝试了两件事,(成功了!):

  • 从合并语句中删除“WHEN NOT MATCHED”部分
  • 使用我尝试合并的同一行运行更新语句

为什么使用合并更新不成功,而插入可以,直接更新也可以?

更新:

设法找到实际的行大小 - 4978。我创建了一个只有这一行的新表,并通过这种方式找到行大小: 在此处输入图片说明

而且我仍然没有看到超出允许限制的东西。

更新(2):

完全重现

努力使这种复制不需要任何额外的辅助对象,并且数据将(有点)混淆。

在 2012 版和 2008 版的几台服务器上尝试了这一点,并且能够在所有服务器中完全重现。

sql-server sql-server-2012 merge

8
推荐指数
1
解决办法
2164
查看次数

当贡献列已经是唯一的时,计算列上的唯一索引

我有一个这样的表:

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

4
推荐指数
1
解决办法
203
查看次数