小编Yos*_*ari的帖子

在子查询中使用 DISTINCT 作为提示有用吗?

DISTINCT在下面的例子中添加对查询运行时间有什么影响吗?
有时将其用作提示是否明智?

SELECT *
FROM   A
WHERE  A.SomeColumn IN (SELECT DISTINCT B.SomeColumn FROM B) 
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server

19
推荐指数
1
解决办法
869
查看次数

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
查看次数

更新大小为 5k 的行时出现 8k 行溢出错误

我正在尝试将一行大小为 5k 的目标表更新为一行大小为 5k 的目标表。

由于它是一行,因此很容易知道行的实际大小:

select *
from sys.dm_db_index_physical_stats(DB_ID('RODS_HSD_ES'), 
OBJECT_ID(N'TBL_BM_HSD_SUBJECT_AN_148_REPRO'), NULL, NULL, 'DETAILED')
Run Code Online (Sandbox Code Playgroud)

复制

表自创建以来没有改变。没有看到它应该失败的任何原因。想法?

sql-server sql-server-2012 update

8
推荐指数
2
解决办法
2128
查看次数