【问题标题】:T-SQL Query errors when using TOP ()- but not when pulling the full query使用 TOP () 时出现 T-SQL 查询错误,但在拉取完整查询时不会出现
【发布时间】:2020-09-16 00:19:34
【问题描述】:

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

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

它只是包括导致错误的TOP(任何东西)。甚至SELECT TOP (1) * FROM View - 反复出错。

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

具体错误是:

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

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

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

【问题讨论】:

    标签: sql sql-server tsql azure-sql-server


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢!修复它没问题(已经在我的问题和您的评论之间完成)。但不管我真的很困惑为什么,错误并不总是存在。对于 1.) 执行 SELECT * 根本没有出现错误 - 即使在查询完成后,它也很好。还是我误解了 1.) 也许?
    • @bbb0777 。 . .查询可能都必须完成并且您可能需要阅读所有结果。但第二种可能性可能是真正发生的事情——如果行在whereon 条件下被过滤掉。注意:我认为(2)是一个错误。然而,微软显然不同意。
    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2019-01-03
    • 2020-09-27
    • 2011-12-03
    相关资源
    最近更新 更多