传递给 LEFT 或 SUBSTRING 函数的长度参数无效 4

Invalid length parameter passed to the LEFT or SUBSTRING function 4

我知道这里有类似的问题,但 none 正是我需要的。我有一个 SQL 存储过程,它的一部分执行一个视图。我有 3 个在设计和功能上相同的数据库,但数据不同,我只在其中一个上收到此错误。如果我从错误的数据库中获取视图并在其他数据库中执行它,它运行得很好。最奇怪的是,这个视图工作了,然后停止了,然后自我修复并再次开始工作,当我开始对一些数据进行更改时,它又停止了。

我已经把它归结为这一行;

Left(AO.Name,PATINDEX('%-%',AO.Name)-1) as ColumnName

有趣的是,如果我将 '%-% 更改为 '%',错误就会消失并且我的 SPROC 会正确执行。

我有五个问题;

  1. 当我有 '%-%' 但没有 '%' 时,为什么会出现此错误?使用一个与另一个相比,有什么区别?有什么样的变化?

  2. 这个错误是什么意思?

  3. 为什么完全相同的视图可以在其他两个相同的数据库上正常工作,但不能在这个数据库上正常工作?

  4. 为什么这会在工作后停止工作,然后以某种方式自我修复,然后在一些数据操作后再次崩溃?

  5. 我可以使用 PATINDEX 之外的更好方法吗?

感谢任何帮助。谢谢你。

当字符串中没有连字符时会发生这种情况。

首先,在这种情况下,您可以将 PATINDEX() 替换为 CHARINDEX()

LEFT(AO.Name, CHARINDEX('-', AO.Name) - 1) as ColumnName

这并没有解决问题,但遵循起来更简单。

那么,问题是AO.Name没有连字符。在那种情况下 PATINDEX()(和 CHARINDEX() 也是)returns 0。您减去 1,该值作为 LEFT().

的第二个参数是非法的

最简单的解决方案是在末尾加上一个连字符:

LEFT(AO.Name, CHARINDEX('-', AO.Name + '-') - 1) as ColumnName