T-SQL 使用 TOP() 时查询错误- 但拉取完整查询时不会

T-SQL Query errors when using TOP ()- but not when pulling the full query

我们在 Azure SQL 服务器中有一个视图出错了 - 但只有在使用 TOP 时才会出错。

只是包含导致错误的 TOP(任何内容)。甚至 SELECT TOP (1) * FROM View - 反复出错。

(并不是我团队中的每个人都同时忘记了 TOP 的语法 - 而且在通过 SSMS 界面选择 SELECT TOP 1000... 时也会忘记)。

具体错误为:

Msg 537, Level 16, State 3, Line 1. Invalid length parameter passed to the LEFT or SUBSTRING function.

这当然 - 鉴于查询,这可能是一个错误:有些东西被分隔符分割,但需要在 WHERE 子句中删除缺少该分隔符的条目。

但是为什么只有在使用TOP时才抛出这个?我有点不知所措。

最可能的原因是 select top 更改了执行计划 -- 可能是因为选择了列。

然后,可能会发生以下两种情况之一:

  1. table 中的某些行生成错误但不在具有初始执行计划的结果集中。您在第一个查询中看不到错误,因为它们尚未返回该行。但是修改后的执行计划returns排得更快。

  2. SQL 服务器在执行图中推送了一个谓词。该行可能会被过滤掉,但与此同时。 . .它会产生一个错误。

另外,这些也很难弄清楚。但是,代码可能明显调用了 left()substring() 导致了问题。如果你能找到导致问题的代码,修复它应该很简单。