T-SQL 使用 TOP() 时查询错误- 但拉取完整查询时不会
T-SQL Query errors when using TOP ()- but not when pulling the full query
我们在 Azure SQL 服务器中有一个视图出错了 - 但只有在使用 TOP 时才会出错。
SELECT * FROM View
= 很好。
SELECT [list every column individually] FROM View
= 很好
- 从视图中获取底层代码 运行 它 = 没问题。
只是包含导致错误的 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
更改了执行计划 -- 可能是因为选择了列。
然后,可能会发生以下两种情况之一:
table 中的某些行生成错误但不在具有初始执行计划的结果集中。您在第一个查询中看不到错误,因为它们尚未返回该行。但是修改后的执行计划returns排得更快。
SQL 服务器在执行图中推送了一个谓词。该行可能会被过滤掉,但与此同时。 . .它会产生一个错误。
另外,这些也很难弄清楚。但是,代码可能明显调用了 left()
或 substring()
导致了问题。如果你能找到导致问题的代码,修复它应该很简单。
我们在 Azure SQL 服务器中有一个视图出错了 - 但只有在使用 TOP 时才会出错。
SELECT * FROM View
= 很好。SELECT [list every column individually] FROM View
= 很好- 从视图中获取底层代码 运行 它 = 没问题。
只是包含导致错误的 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
更改了执行计划 -- 可能是因为选择了列。
然后,可能会发生以下两种情况之一:
table 中的某些行生成错误但不在具有初始执行计划的结果集中。您在第一个查询中看不到错误,因为它们尚未返回该行。但是修改后的执行计划returns排得更快。
SQL 服务器在执行图中推送了一个谓词。该行可能会被过滤掉,但与此同时。 . .它会产生一个错误。
另外,这些也很难弄清楚。但是,代码可能明显调用了 left()
或 substring()
导致了问题。如果你能找到导致问题的代码,修复它应该很简单。