2016-01-07 171 views
2

大约两周前,一直在过去6个月工作的一些SQL在没有任何更改的情况下开始抛出一个错误。我花了几天的时间试图找出发生了什么事情,但没有任何意义。最后,我试着在存储过程(它没有任何作用)上进行“更改”,然后最终删除并重新创建它(它确实修复了它)。传递给RIGHT函数的长度参数无效

然后,2天前,错误回来了,这次即使drop/create也没有修复它。根据我的IT人员,他们在1.5个月内没有修补SQL Server,所以没有任何改变。有没有人有任何想法或有相同的问题?

这行代码,在存储过程:

SELECT LabelText + Data 
FROM CU_FormLayout fl 
    INNER JOIN CU_Data dat ON dat.LayoutId = fl.Id 
    CROSS APPLY (SELECT RIGHT(fl.xLabelText,1) RightChar) ca2 
    CROSS APPLY (SELECT CASE WHEN ASCII(RightChar) BETWEEN 49 AND 57 OR 
           ASCII(RightChar) BETWEEN 65 AND 90 OR 
           ASCII(RightChar) BETWEEN 97 AND 122 
          THEN fl.xLabelText + ': ' 
          ELSE fl.xLabelText + ' ' END LabelText) ca1 

导致此错误:

Invalid length parameter passed to the RIGHT function.

正如你看到的,唯一的RIGHT()有一个硬编码的长度。它怎么会失效?

顺便说一句,这段代码的重点在于它需要一列中的“标签”,如果以字母或数字结尾,则添加“:”,然后添加标签的数据值。其他方面只是在它们之间放置一个空间。

+0

你有没有机会得到错误引发的确切数据('fl.xLabelText')? –

+0

@TT。上面的SQL为整个表运行它,它不会出错。 SP中的SQL包含一个'WHERE'子句,它可以为单个ID执行此操作。无论哪一个我都可以这样做,每次在SP中都会出错。最终的结果是将其填入一个变量,然后用于发送给用户的电子邮件。除了通过完整的SP之外,我无法重现该错误。即使我复制所有代码并将其放入脚本中,它也可以正常运行。正如我刚才提到的那样,我最后一次修复它是通过DROP/CREATE。没有代码改变。 – Steve

+1

也许如果你找不到原因(这可能会影响生产环境),你可以使用'SUBSTRING'重写?或者是'REVERSE'和'LEFT'的组合? –

回答

1

也许如果你找不到原因(这可能是生产环境的问题),你可以使用SUBSTRING来重写?或者组合REVERSE & LEFT

+0

通过这样做,我能够发现我的问题是在别的地方,因为我的代码给出了相同的错误,当它不应该有。谢谢 – Steve

+0

@Steve不客气Steve =) –

相关问题