小编Dom*_*que的帖子

由于 WHERE 子句中有超过 100,000 个条目,SQL Server 错误 8632

我的问题(或至少是错误消息)与查询处理器耗尽内部资源非常相似- 非常长的 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 configuration limits

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

这个 SQL 请求什么时候产生结果?

我正在开发一个 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-server scheduled-tasks archive-log

7
推荐指数
2
解决办法
1632
查看次数

在 SQL Server 中将 SQL 文件嵌套到另一个文件中

我有一个简单的 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)

sql-server t-sql external-scripts

3
推荐指数
1
解决办法
2722
查看次数

如何告诉 Microsoft SQL Server Management Studio 数据库重命名必须完全完成

我有一个旧的数据库副本。我通过备份从客户系统中检索它并将其恢复到我的本地 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”。

提前致谢

sql-server ssms restore rename

0
推荐指数
2
解决办法
557
查看次数