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

时间:2016-09-18 19:50:25

标签: sql sql-server patindex

我意识到这里有类似的问题,但它们都不是我需要的。我有一个SQL sproc,它的一部分执行一个视图。我有3个数据库在设计和功能上相同,但数据不同,我只在其中一个数据库上收到此错误。如果我从错误的DB中获取视图并在其他一个上执行它,它运行就好了。最奇怪的部分是这个视图工作,然后停止,然后自行修复并重新开始工作,当我开始对某些数据进行更改时,它再次停止。

我把它归结为这条特定的路线;

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

有趣的是,如果我将'%-%更改为'%',则错误消失,我的SPROC正常执行。

我有五个问题;

  1. 为什么我有'%-%'而非'%'时收到此错误?什么是差异,使用一个与另一个做出了什么样的改变?

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

  3. 为什么完全相同的视图在另外两个相同的数据库上正常工作但不是这个?

  4. 为什么它会在它工作后停止工作,然后以某种方式修复自己,然后在一些数据操作后再次破坏自己?

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

  6. 感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

这不能解决问题,但更容易理解。

然后,问题是AO.Name没有连字符。在这种情况下,PATINDEX()(和CHARINDEX()也会)返回0.您减去1并且该值非法作为LEFT()的第二个参数。

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

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