使用TOP-时出现T-SQL查询错误,但拉出完整查询时不会出现T-SQL查询错误

问题描述

Azure sql服务器中的一个视图有错误-但仅在使用TOP时出现。

  • SELECT * FROM View =很好。
  • SELECT [list every column individually] FROM View =很好
  • 从视图中获取基础代码并运行= fine。

仅包含导致错误的TOP(所有内容)。甚至SELECT TOP (1) * FROM View-反复出现错误

(并不是我的团队中的每个人都同时忘记了TOP的语法-另外,当通过SSMS界面选择SELECT TOP 1000...时,它也会这样做)。

具体错误是:

消息537,级别16,状态3,行1。无效的长度参数传递给LEFT或SUBSTRING函数

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

但是为什么只在使用TOP时才抛出此错误我有点茫然。

解决方法

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

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

  1. 表中的某些行会产生错误,但不在初始执行计划的结果集中。您不会在第一个查询中看到错误,因为它们尚未返回该行。但是更改后的执行计划会更快地返回该行。

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

此外,这些很难弄清楚。但是,该代码可能对left()substring()进行了明显的调用,从而导致了问题。如果您找到导致问题的代码,则修复它应该非常简单。