我的问题(或至少是错误消息)与查询处理器耗尽内部资源非常相似- 非常长的 sql query。
我的客户正在使用 SQL 选择查询,其中包含一个恰好包含 100,000 个条目的 where 子句。
查询失败,错误 8632 和错误消息
内部错误:已达到表达式服务限制。请在您的查询中寻找潜在的复杂表达式,并尝试简化它们。)
我发现抛出此错误消息非常奇怪,正好是 100,000 个条目,所以我想知道这是否是一个可配置的值。是这种情况吗?如果是,我怎样才能将此值增加到更高的值?
在MSDN 上,有人提议重新编写查询,但我想避免这种情况。
同时我发现我正在谈论的条目列表包含自然数,其中相当一部分似乎是连续的(例如 (1,2,3,6,7,8,9,10,12, 13、15、16、17、18、19、20)。
这使得 SQL where 子句类似于:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Run Code Online (Sandbox Code Playgroud)
我可以将其转换为:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式缩短:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
Run Code Online (Sandbox Code Playgroud)
......或类似的东西?(我知道这是一个长镜头,但它会使软件更新更容易和更易读)
供您参考: where 子句中的数据是在另一个表上完成的计算结果:首先在开始时读取并过滤该表的条目,然后进行一些额外的处理(这是不可能使用的SQL),额外处理的结果是更多的过滤,并且结果用于 where 子句中。由于无法在 SQL 中编写完整的过滤,因此使用了上述方法。显然, where 子句的内容可能会在每次处理时发生变化,因此需要动态解决方案。
我正在开发一个 SQL Server 数据库,其中包含订单和执行这些订单的机器。一台机器不能同时分配多个有效订单。换句话说:这个 SQL 请求永远不会产生结果:
SELECT MachineId
FROM Orders
WHERE (Orders.Status=1)
GROUP BY MachineId
HAVING COUNT(Id)>1
Run Code Online (Sandbox Code Playgroud)
我在 Microsoft SQL Server Management Studio 环境中打开此 SQL 请求,每次按 时F5,我确实看不到任何结果。
但是,我确信 SQL 查询有时确实会产生结果,并且我对那些时间以及当时查询的结果很感兴趣。
有人知道我如何找到这个吗?(“archive-log”标签只是一个想法)
提前致谢
我有一个简单的 SQL 文件,用于执行一些测试:
DECLARE @VAR1 AS VARCHAR(100) = '12345'
DECLARE @VAR2 AS INTEGER = 54321
WAITFOR DELAY '00:00:02'
INSERT Orders SELECT @VAR1 AS COL1, @VAR2 AS COL2, ...
...
Run Code Online (Sandbox Code Playgroud)
在启动这一切之前,我想做一些清理工作:
/* Clean SpecialSubSubEntries */
DELETE SpecialSubSubEntries
WHERE Id IN (SELECT Id FROM SubSubEntries
WHERE SubEntryId IN (SELECT Id FROM SubEntries
WHERE EntryId IN (SELECT Id FROM Entries
WHERE Name='ENTRY01')
)
)
DELETE SubSubEntries
WHERE SubEntryId IN (SELECT Id FROM SubEntries
WHERE EntryId IN (SELECT Id FROM Entries
WHERE Name='ENTRY01')
) …Run Code Online (Sandbox Code Playgroud) 我有一个旧的数据库副本。我通过备份从客户系统中检索它并将其恢复到我的本地 PC 上。我想查看同一数据库的最新副本。显然我不能这样做,在同一个数据库上工作,因为我的旧副本将被覆盖,所以我首先将我的数据库从“Firm_Customer”重命名为“Firm_Customer_orig”。
现在我想恢复数据库的最新副本,但失败了,如以下错误消息中所述:
System.Data.SqlClient.SqlError:无法覆盖文件“C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS01\MSSQL\DATA\Firm_Customer.mdf”。它正在由数据库“Firm_Customer_orig”使用。(Microsoft.SqlServer.SmoExtended)
我期望数据库从“Firm_Customer”重命名为“Firm_Customer_orig”也会导致文件“C:\Program Files\Microsoft SQL Server...\Firm_Customer.mdf”的重命名,但显然数据库重命名只是“部分” ”。
有没有办法强制数据库重命名以执行完整重命名(与“Firm_Customer”相关的所有内容都必须重命名为“Firm_Customer_orig”)?
哦,在我忘记之前:我正在使用 Microsoft SQL Server Management Studio,版本“v18.12”。
提前致谢