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



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

我把它浓缩成这一行;

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

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

我有五个问题;

  1. 为什么当我有'%-%'而不是'%'时我得到这个错误?使用其中一种和另一种有什么区别和什么样的改变?

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

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

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

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

任何帮助都是感激的。谢谢你!

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

首先,在本例中可以用CHARINDEX()替换PATINDEX():

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

相关内容

  • 没有找到相关文章

最新更新