我的实际工作查询是内部联接,但是这个带有交叉联接的简单示例似乎几乎总是会重现该问题。
SELECT *
FROM (
SELECT 1 UNION ALL
SELECT 2
) AA ( A )
CROSS JOIN (
SELECT NEWID() TEST_ID
) BB ( B )
Run Code Online (Sandbox Code Playgroud)
通过我的内部连接,我有很多行,我使用 NEWID() 函数为每个行添加了一个 GUID,对于大约 10 个这样的行中的 9 个,与 2 行虚拟表的乘法产生了预期的结果,只有 2 个副本相同的 GUID,而十分之一会产生不同的结果。至少可以说这是出乎意料的,让我很难在我的测试数据生成脚本中找到这个错误。
如果您使用非确定性 getdate 和 sysdatetime 函数查看以下查询,您将看不到这一点,无论如何我都看不到 - 我总是在两个最终结果行中看到相同的日期时间值。
SELECT *
FROM (
SELECT 1 UNION ALL
SELECT 2
) AA ( A )
CROSS JOIN (
SELECT GETDATE() TEST_ID
) BB ( B )
SELECT *
FROM (
SELECT 1 UNION …Run Code Online (Sandbox Code Playgroud) ;WITH
cte_Date ( DateCode_FK ) AS (
SELECT DATEADD( DAY,
1 - ROW_NUMBER() OVER (
ORDER BY so1.object_id ),
GETDATE() )
FROM sys.objects so1
CROSS APPLY sys.objects so2 )
SELECT TOP 10 d.DateCode_FK
FROM cte_Date d
ORDER BY d.DateCode_FK DESC;
Run Code Online (Sandbox Code Playgroud)
没什么特别有趣的查询,但是如果我使用以下ORDER BY子句运行它,我会收到一条错误消息:
Msg 517, Level 16, State 1, Line 4
向“日期时间”列添加值会导致溢出。
但是,没有ORDER BY子句,它运行得很好。此外,如果我在同一服务器上的同一实例中包含的其他目录上运行查询,无论是否使用该ORDER BY子句,该查询都可以正常运行。
我查看了受影响的目录和查询按预期运行的目录之间的配置选项和兼容性级别,但没有发现任何可能保证差异的内容。有没有其他人遇到过类似的问题?我现在可以解决它,但理想情况下需要能够解决问题,无论它是什么。
潜在提示 - 如果您在目录中有相对大量的对象(> 5000),您 - 可能 - 能够重现该错误......这发生在我最大的目录中,如果我在其中包含一个 TOP CTE,ORDER BY 问题消失了。
我收到一个非常奇怪的错误。考虑下表:
CREATE TABLE #MyTable (
Key1 INT , Key2 INT ,
x SMALLINT , y INT , z INT ,
a FLOAT , b FLOAT , c SMALLINT , s FLOAT
)
-- insert many records
CREATE UNIQUE CLUSTERED INDEX CI ON #MyTable ( Key1 , Key2 )
Run Code Online (Sandbox Code Playgroud)
出于某种原因,以下更新语句尝试除以零。这只能在c=0或 时发生c=1。该WHERE条款明确规定c>1。
-- this fails with divide-by-zero error
UPDATE #MyTable
SET s = CASE
WHEN a - SQUARE ( b ) / c <= …Run Code Online (Sandbox Code Playgroud)