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

Dom*_*que 7 sql-server scheduled-tasks archive-log

我正在开发一个 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”标签只是一个想法)

提前致谢

Zik*_*ato 10

我将创建一个唯一的过滤索引并跟踪唯一约束违规。它首先可以防止错误数据,并且与定期轮询表不同,您不会错过错误的发生。

定义是

CREATE UNIQUE NONCLUSTERED INDEX IX_Orders_StatusPerMachine
ON dbo.Orders(MachineId) 
WHERE (Status = 1)
Run Code Online (Sandbox Code Playgroud)

然后我将使用error_reported扩展事件来跟踪特定的错误号,这可能是:

消息 2601
无法在具有唯一索引“%.*ls”的对象“%.*ls”中插入重复的键行。重复的键值是 %ls。

并获取一些附加信息,例如app_namehost_nametsql_stack以查找根本原因。

我在博客中介绍了有关扩展事件调试错误的信息
https://straightforwardsql.com/posts/investigating-errors-with-extended-events/

  • 这不是我的情况,我只是建议OP在生产中小心实施这种类型的解决方案(这是一个很棒的解决方案,不要误会我的意思),而不进行测试。但这几乎适用于所有解决方案,所以‍♂️ (2认同)

Mic*_*een 6

创建一个日志表。将您的查询更改为

INSERT LoggingTable(...)
SELECT MachineId, SYSUTCDATETIME()
...
Run Code Online (Sandbox Code Playgroud)

根据需要使用 SQL 代理运行此查询。(最短间隔为 1 分钟。)

问题是您只能看到每隔几分钟执行一次查询的几毫秒内存在的错误 - 占系统运行时间的一小部分。如果您向订单添加时间跟踪,您可以看到发生的每一个变化。然后,您可以对此历史记录运行分析查询以检测错误。如果需要,可以将历史记录复制到单独的存档数据库,并在不再需要时从操作数据库中删除,以保持该数据库的精简。