我意识到这里有类似的问题,但没有一个是我所需要的。我有一个SQL进程,它的一部分执行视图。我有3个数据库,在设计和功能相同,但数据是不同的,我得到这个错误只有一个。如果我从错误的数据库中获取视图并在其他数据库中执行它,它运行得很好。最奇怪的是,这个视图工作了,然后停止,然后修复自己并重新开始工作,当我开始更改一些数据时,它又停止了。
我把它浓缩成这一行;
Left(AO.Name,PATINDEX('%-%',AO.Name)-1) as ColumnName
有趣的部分是,如果我将'%-%
更改为'%'
,错误就会消失,我的SPROC会正确执行。
我有五个问题;
为什么当我有
'%-%'
而不是'%'
时我得到这个错误?使用其中一种和另一种有什么区别和什么样的改变?这个错误是什么意思?
为什么完全相同的视图在其他两个相同的数据库上正常工作,而不是这个?
为什么这在工作后会停止工作,然后以某种方式修复自己,然后在一些数据操作后再次断开自己?
我可以使用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